3

我想在动画完成后执行 doSomethingElse 。另一个限制是动画代码可以有不同的持续时间。我怎样才能做到这一点?谢谢!

-(void) doAnimationThenSomethingElse {
  [self doAnimation];
  [self doSomethingElse];
}

例如,这不起作用:

animationDuration = 1;
[UIView animateWithDuration:animationDuration
    animations:^{
      [self doAnimation];
    } completion:^(BOOL finished) {
      [self doSomethingElse];
    }
];
4

5 回答 5

24

当您不是动画的作者时,您可以使用事务完成块在动画结束时获得回调:

[CATransaction setCompletionBlock:^{
     // doSomethingElse
}];
// doSomething
于 2013-05-03T22:54:13.553 回答
7

使用块动画:

[UIView animateWithDuration:animationDuration
    animations:^{
        // Put animation code here
    } completion:^(BOOL finished) {
        // Put here the code that you want to execute when the animation finishes
    }
];
于 2013-05-03T21:52:45.370 回答
2

您需要能够访问正在运行的动画的特定实例,以便协调每个动画的完成操作。在您的示例中, [self doAnimation] 不会向我们展示任何动画,因此您提供的内容无法“解决”您的问题。

有几种方法可以实现您想要的,但这取决于您正在处理的动画类型。

正如其他答案中指出的那样,在视图上的动画之后执行代码的最常见方法是传入completionBlock:animateWithDuration:completion:另一种处理属性更改动画的方法是CATransaction在事务范围内设置完成块。

然而,这些特定的方法基本上是用于动画属性或视图层次结构的变化。当您的动画涉及视图及其属性时,这是推荐的方式,但它并不涵盖您可能在 iOS 中找到的所有类型的动画。根据您的问题,尚不清楚您正在使用哪种动画(或如何使用或为什么使用),但如果您实际上正在触摸 CAAnimations 的实例(关键帧动画或一组动画),您将通常做的是设置一个委托:

CAAnimation *animation = [CAAnimation animation];
[animation setDelegate:self];
[animatedLayer addAnimation:animation forKeyPath:nil];

// Then implement the delegate method on your class
- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag
{
    // Do post-animation work here.
}

关键是,完成处理的实现方式取决于动画的实现方式。在这种情况下我们看不到后者,因此我们无法确定前者。

于 2013-05-03T22:16:41.970 回答
0

http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIView_Class/UIView/UIView.html

有 UIView 文档,向下滚动到

使用块动画视图

动画视图

查看将您跳转到解释如何动画视图的页面不同部分的超链接,您想要的那些在“使用块动画视图”下阅读方法的名称使它们不言自明

于 2013-05-03T22:01:31.767 回答
0

根据您的评论,我建议您:

-(void) doAnimation{
    [self setAnimationDelegate:self];
    [self setAnimationDidStopSelector:@selector(finishAnimation:finished:context:)];
    [self doAnimation];
}

- (void)finishAnimation:(NSString *)animationId finished:(BOOL)finished context:(void *)context {
    [self doSomethingElse];
}
于 2013-05-03T22:34:31.320 回答