我想在动画结束后执行doSomethingElse。另一个限制是动画代码可以具有不同的持续时间。我怎样才能做到这一点?谢谢!
-(void) doAnimationThenSomethingElse {
[self doAnimation];
[self doSomethingElse];
}
例如,这不起作用:
animationDuration = 1;
[UIView animateWithDuration:animationDuration
animations:^{
[self doAnimation];
} completion:^(BOOL finished) {
[self doSomethingElse];
}
];
答案 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)
有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];
}