2010-04-28 184 views
2

在iPhone應用程序中,我嘗試使用setAnimationDidStopSelector捕捉動畫結尾。我嘗試暫停代碼執行,直到動畫結束。我試過這個;設置一個全局BOOL變量,在提交動畫之前以及在使用while循環等待動畫之後將其設置爲TRUE。在setAnimationDidStopSelector中,將BOOL變量設置爲FALSE,並希望while循環中斷。但不幸的是,這不起作用,代碼甚至沒有落入setAnimationDidStopSelector(我用一些跟蹤輸出來檢查它)。編輯:如果該BOOL變量處理不添加,代碼運行到處理程序方法。iPhone等待動畫結束

其中動畫發生的代碼如下:

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

你有什麼建議?

回答

-1

直到此循環結束,動畫纔會啓動。這個循環直到動畫開始纔會完成。

while(![self AnimationEnded]); 

無論你想在動畫需要進入animationDidStop方法後要做什麼。

+0

? – 2010-04-28 07:16:50

+2

iPhone OS面向運行循環。而不是坐在自己的緊密循環中等待一些事情,註冊一個回調或設置一個計時器,讓運行循環運行。 – drawnonward 2010-04-28 17:06:45

+1

繁忙的循環是一種可怕的方法,並且從UI線程執行它更糟糕。 – 2012-11-20 17:08:09

1

您必須調用setAnimationDelegate:來指定您希望在動畫停止時調用選擇器的對象。假設將您的標誌設置爲FALSE的方法與您創建動畫的類相同,將爲self。詳情請參閱UIView class reference

+0

我沒有得到;編輯我的問題,並添加代碼...即使它在外面的動畫塊, – 2010-04-28 02:29:16

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

+UIView animateWithDuration:animations:completion:在iOS開發者的網站了解。

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