2010-07-14 9 views
4

所以我有一些動畫塊可以在我的應用上創建一些非常簡單的動畫(例如連續旋轉的輪子)。這是動畫的代碼(如果來自舊的commanimations樣式塊,我已經改變了,但得到同樣的問題)。爲什麼我需要這樣做,還有更好的方法嗎? iPhone應用上的動畫塊OS4

[UIView animateWithDuration:30 delay:0.0 
    options:(UIViewAnimationOptionAllowUserInteraction | 
    UIViewAnimationOptionCurveLinear 
    | UIViewAnimationOptionRepeat) 
animations:^(void){ 
    wheel.transform = CGAffineTransformMakeRotation(M_PI*-0.5); 
} 
completion:^(BOOL finished){ 
if(finished){NSLog(@"^^^^^^^^wheel^^^^FINSIHED"); 
    ]} 
}]; 

我遇到的問題是,在OS4上,當應用程序被解散到多任務欄並恢復動畫停止。如果在恢復時重置位置,當應用程序再次變得活躍,像這樣......

wheel.transform = CGAffineTransformMakeRotation(0); 

然後它繼續。

這並不理想,因爲我的動畫在重新啓動時跳過。我不明白爲什麼會發生這種情況,或者爲什麼我需要這樣做。

隨着動畫的開始,「完成」方法幾乎立即被調用,這很奇怪,因爲此動畫永遠不會完成。當應用程序變爲活動狀態並且動畫實際停止時,它也不會被調用。

任何任何想法或建議?我一直在爲此奮鬥一段時間...

回答

0

您的代碼的語法無效;您的代碼將不會如圖所示進行編譯。正確的版本應該是:

[UIView animateWithDuration:2 delay:0.0 
        options:(UIViewAnimationOptionAllowUserInteraction | 
          UIViewAnimationOptionCurveLinear 
          | UIViewAnimationOptionRepeat) 
       animations:^(void){ 
        wheel.transform = CGAffineTransformMakeRotation(M_PI*-0.5); 
       } 
       completion:^(BOOL finished){ 
        if(finished) NSLog(@"^^^^^^^^wheel^^^^FINSIHED"); 
       } 
    ]; 

之所以塊「完了就」被調用時暫停後的應用程序恢復並設置動畫再次去是車輪的變換已經處於其最終位置(此是您在動畫塊中設置的位置)。所以,當應用程序恢復時,您必須先重置輪子的變換(我將通過將其設置爲CGAffineTransformIdentity來完成此操作),然後設置動畫。

更聰明的方法是使用CGAffineTransformRotate(而不是CGAffineTransformMakeRotation)。這樣,您可以根據現在的變換來設置變換,而不是完全設置變換。

[UIView animateWithDuration:2 delay:0.0 
        options:(UIViewAnimationOptionAllowUserInteraction | 
          UIViewAnimationOptionCurveLinear 
          | UIViewAnimationOptionRepeat) 
       animations:^(void){ 
        wheel.transform = CGAffineTransformRotate(view.transform, (M_PI*-0.5)); 
       } 
       completion:^(BOOL finished){ 
        // whatever 
       } 
    ]; 

我相信,你的車輪是對稱相對於您所選擇的角度,這樣用戶將永遠不會看到的差異,以及滑移你抱怨(當你重置變換)將被淘汰。

1

您應該使用NSTimer或使用CADisplaylink設置計時器,如下所示: displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(animateImages :)];並在委託方法中更改視圖的旋轉CGAffineTransformMakeRotation(度)。

+0

謝謝,我可以使用計時器爲零件製作動畫,但我並沒有真正考慮過這個問題。這似乎更復雜,但你知道爲什麼我的方法不工作? – user157733 2010-07-22 11:34:07

+0

對於像這樣的長時間運行的動畫,'NSTimer'或'CADisplayLink'是更好的選擇。「UIView」動畫的意圖是短暫的,通常是由於用戶交互。 – 2010-09-27 19:15:14

1

我有類似的問題。我可以通過 來關閉應用程序在後臺運行的能力,通過添加 關鍵字「應用程序不在後臺運行」並在info.plist中將其設置爲YES 來解決此問題。如果您的應用程序不需要在後臺運行,並且 在恢復時恢復到其初始狀態,那麼此 將起作用。

相關問題