iPhone等待动画结束

时间:2010-04-28 00:54:38

标签: iphone

在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;
}

你有什么建议?

4 个答案:

答案 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方法后,无论你想做什么。