2012-04-18 3 views
0

Я пытаюсь заменить вид другим, используя скользящую анимацию сверху. Я как-то следил за гидом, размещенным здесь в http://gentlebytes.com/2011/09/auto-layout-in-lion/, но без NSConstraints.animationDidStop: finished: not called

К сожалению, методы делегата animationDidStop: finished: моей анимации не вызывается в конце анимации.

Вот мой код:

- (void)slideViewControllerFromTop:(NSViewController *)controller { 
[self replacePlaceholderViewWith:controller block:^(NSView *placeholder, NSView *currentView, NSView *newView) { 
    NSRect initialFrameNewView = NSMakeRect(placeholder.bounds.origin.x, 2*placeholder.bounds.size.height - newView.frame.size.height - DISTANCE_FROM_TOP, placeholder.bounds.size.width, newView.frame.size.height); 
    [newView setFrame:initialFrameNewView]; 
    NSRect finalFrameNewView = NSMakeRect(placeholder.bounds.origin.x, placeholder.bounds.size.height - newView.frame.size.height - DISTANCE_FROM_TOP, 0.91*placeholder.bounds.size.width, newView.frame.size.height); 

    NSRect finalFrameCurrentView = NSMakeRect(currentView.frame.origin.x, currentView.frame.origin.y-placeholder.bounds.size.height, currentView.frame.size.width, currentView.frame.size.height); 

    CABasicAnimation *animation = [CABasicAnimation animation]; 
    animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
    [animation setDelegate:self]; 
    [animation setDuration:0.5]; 
    animation.removedOnCompletion = YES; 

    [newView setAnimations:[NSDictionary dictionaryWithObject:animation forKey:@"frame"]]; 
    [currentView setAnimations:[NSDictionary dictionaryWithObject:animation forKey:@"frame"]]; 

    [placeholder addSubview:newView]; 
    [NSAnimationContext beginGrouping]; 
    [[newView animator] setFrame:finalFrameNewView]; 
    [[currentView animator] setFrame:finalFrameCurrentView]; 
    [NSAnimationContext endGrouping]; 
}]; 
} 

- (void)replacePlaceholderViewWith:(NSViewController *)controller block:(GBPlaceholderReplaceBlock)handler { 
    if (controller == self.currentViewController) return; 
    self.previousViewController = self.currentViewController; 
    self.currentViewController = controller; 
    NSView *placeholderView = self.contentView; 
    NSView *currentView = self.contentView.subviews.lastObject; 
    NSView *newView = self.currentViewController.view; 
    handler(placeholderView, currentView, newView); 
} 

- (void)animationDidStop:(CABasicAnimation *)anim finished:(BOOL)flag { 
    if (!flag || self.contentView.subviews.count < 2) return; 
    [[self.contentView.subviews objectAtIndex:0] removeFromSuperview]; 
    self.previousViewController = nil; 
} 

ответ

1

Попробуйте заменить эти два

[newView setAnimations:[NSDictionary dictionaryWithObject:animation forKey:@"frame"]]; 
[currentView setAnimations:[NSDictionary dictionaryWithObject:animation forKey:@"frame"]]; 

к

[newView.layer addAnimation:animation forKey:@"frame"]; 
[currentView.layer addAnimation:animation forKey:@"frame"]; 

И не забудьте добавить #import <QuartzCore/QuartzCore.h> в верхней части файла класса ,

+0

Спасибо. Это сделал трюк. Сначала я подозревал, что мне нужны слои, но так как анимация работала, я думал, что они действительно не нужны. – Jacopo

+0

@ Jacopo приветствую :) – Kjuly