等待动画在iOS完成?

时间:2013-05-03 21:44:17

标签: ios objective-c animation

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

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

例如,这不起作用:

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

5 个答案:

答案 0 :(得分:21)

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

[CATransaction setCompletionBlock:^{
     // doSomethingElse
}];
// doSomething

答案 1 :(得分: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
    }
];

答案 2 :(得分:2)

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

实现你想要的东西的方法很少,但这取决于你正在处理什么样的动画。

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

但是,这些特定方法基本上是为视图的属性或层次结构更改设置动画。当您的动画涉及视图及其属性时,这是推荐的方式,但它不包括您可能在iOS中找到的所有类型的动画。从你的问题来看,你不清楚你正在使用什么样的动画(或如何或为什么),但如果你实际上正在触摸CAAnimations的实例(一个关键帧动画或一组动画),那么你将会是什么通常做的是设置委托:

CATransaction

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

答案 3 :(得分:0)

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

有UIView文档,向下滚动到

使用块动画视图

动画视图

查看超链接,跳转到页面的不同部分,解释如何动画视图,你想要的是 “使用块动画视图” 阅读方法的名称使它们自我解释

答案 4 :(得分: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];
}