我希望动画完成后执行doSomethingElse。 另一个限制是,动画代码可以是不同的持续时间。 我怎样才能做到这一点? 谢谢!
-(void) doAnimationThenSomethingElse {
[self doAnimation];
[self doSomethingElse];
}
例如,这不工作:
animationDuration = 1;
[UIView animateWithDuration:animationDuration
animations:^{
[self doAnimation];
} completion:^(BOOL finished) {
[self doSomethingElse];
}
];
当你不是动画的作者,你可以当动画通过使用交易完成块结束得到一个回调:
[CATransaction setCompletionBlock:^{
// doSomethingElse
}];
// doSomething
使用块动画:
[UIView animateWithDuration:animationDuration
animations:^{
// Put animation code here
} completion:^(BOOL finished) {
// Put here the code that you want to execute when the animation finishes
}
];
你需要能够访问您正在运行的动画的具体事例,以协调为每一个完成的动作。 在你的榜样,[自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.
}
问题的关键是,你完成处理实现是如何依赖于你的动画是如何实现的。 在这种情况下,我们不能看到后者,所以我们不能确定前者。
http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIView_Class/UIView/UIView.html
有UIView的文档,向下滚动到
与块动画浏览
和
动画视图
看“动画与块视图”读书的方法的名称下是跳到你解释如何制作动画的看法,您要的是那些在页面的不同部分的超链接使他们的自我解释
从你的意见,我会建议你:
-(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];
}