在iPhone应用程序中,我尝试使用setAnimationDidStopSelector捕获动画结尾。我尝试暂停代码执行,直到动画结束。我试过这个;设置一个全局BOOL变量,在提交动画之前和使用while循环等待提交动画之后将其设置为TRUE。在setAnimationDidStopSelector中,将BOOL变量设置为FALSE并希望while循环中断。但不幸的是,这不起作用,代码甚至没有落入setAnimationDidStopSelector(我用一些跟踪输出检查)。编辑:如果没有添加BOOL变量处理,代码将运行到处理程序方法。
动画发生的代码如下:
self.AnimationEnded=FALSE;
[UIView beginAnimations:NULL context:NULL];
[UIView setAnimationDuration:2];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];
// do sth.
[UIView commitAnimations];
while(![self AnimationEnded]);
这也是处理程序的代码:
- (void)animationDidStop:(NSString*)animationID finished:(NSNumber*)finished context:(void*)context {
printf("abc\n"); fflush(stdout);
self.AnimationEnded=true;
}
你有什么建议?
答案 0 :(得分:3)
在iOS 4中,您可以设置完成块,而不是使用动画委托和处理程序。这是一种在动画结束时采取行动的简单方法。如果您不支持iOS 4之前的设备,我建议您使用它。
您的示例更改为:
self.animationEnded = NO;
[UIView animateWithDuration:2
animations:^{ /* Do something here */ }
completion:^(BOOL finished){
printf("abc\n");
fflush(stdout);
self.animationEnded = YES;
}];
有关详情,请参阅iOS开发者网站上的+UIView animateWithDuration:animations:completion:。
答案 1 :(得分:1)
您必须调用setAnimationDelegate:
来指定动画停止时希望选择器调用的对象。假设将标志设置为FALSE的方法与创建动画的方法属于同一个类,这将是self
。有关详细信息,请参阅UIView class reference。
答案 2 :(得分:1)
试试这个:
__block BOOL done = NO;
[UIView animateWithDuration:0.3 animations:^{
// do something
} completion:^(BOOL finished) {
done = YES;
}];
// wait for animation to finish
while (done == NO)
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]];
// animation is finished, ok to proceed
答案 3 :(得分:-1)
在此循环结束之前,动画不会启动。在动画开始之前,此循环不会完成。
while(![self AnimationEnded]);
在动画需要进入animationDidStop方法后,无论你想做什么。