animationDidStop:已完成:未调用

时间:2012-04-18 07:24:39

标签: cocoa core-animation caanimation

我正在尝试使用顶部的滑动动画替换另一个视图。我有点遵循http://gentlebytes.com/2011/09/auto-layout-in-lion/中发布的指南,但没有NSConstraints。

不幸的是,在动画结束时没有调用我的动画的委托方法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 个答案:

答案 0 :(得分: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>