2013-10-17 70 views
0

假設我的應用程序正在同時運行數十個動畫,並且我想暫停它們,就好像這是一款遊戲並且用戶點擊了暫停按鈕。什麼是最好的方式來做到這一點?我正在使用CAKeyFrameAnimations,UIView.Animate(),CABasicAniamtions等的組合。顯然我可以在用戶暫停時手動停止它們,並在用戶暫停時從停止的位置恢復它們。但是,一個更好的方法來做到這一點?最好的方式來暫停/恢復幾十個動畫?


編輯:我希望能夠通過用戶按下一個按鈕,暫停&恢復。


第二編輯:我喜歡那裏的路90%,但我仍然有一個問題...

這裏是我的Xamarin的iOS項目: https://www.dropbox.com/s/5zbhhao6cijtb1i/Test_Pause.zip

有用Apple參考號: https://developer.apple.com/library/ios/qa/qa1673/_index.html

我有一個應用程序可以啓動位置動畫。當我第一次暫停時,它會正確停頓。當我擊中簡歷時,它會從暫停的地方正確恢復。但是當你第二次再次暫停時(在同一個動畫中),它會從一個位置恢復,就好像它從未暫停過一樣。它暫停前進的方式。當然,理想的結果是當你點擊暫停按鈕時,它會停止在哪裏。

對不起,如果這聽起來令人困惑,我附加的示例項目非常簡單,重現該問題,從上面的鏈接下載我的應用程序。運行。確保在同一個動畫中暫停,恢復,然後再次暫停。任何想法我做錯了什麼?

回答

0

我現在可以成功地暫停和恢復動畫與CAMediaTiming,所有這些都無需停止aniamtion和改變時間和再次啓動它。 See this useful resource

職業等級變量:

UIView MyImage; 
double timeSincePause = 0; 
double pauseTime = 0; 

暫停功能:

MyImage.Layer.Speed = 0.0f; 
MyImage.Layer.TimeOffset = MyImage.Layer.ConvertTimeFromLayer(CAAnimation.CurrentMediaTime(), MyImage.Layer) - timeSincePause; 

恢復功能:

pauseTime = MyImage.Layer.TimeOffset; 
MyImage.Layer.Speed = 1.0f; 
MyImage.Layer.TimeOffset = 0.0f; 
MyImage.Layer.BeginTime = 0.0f; 
timeSincePause = (MyImage.Layer.ConvertTimeFromLayer(CAAnimation.CurrentMediaTime(), MyImage.Layer) - pauseTime); 
MyImage.Layer.BeginTime = timeSincePause; 
0

你可以在繪製方法的開始使用一個布爾值,如果布爾是真實的(指不包括動畫),然後直接去年底

+0

我不確定我瞭解您的回覆。通過CAKeyFrameAnimation連續調用draw方法嗎?我希望能夠暫停每一個動畫(然後用簡歷按鈕進入暫停屏幕),然後將它們從他們離開的地方重新開始...... – LampShade

0

可以使用CAAnimationGroup,這是一個子類CAAnimation,並操縱其成分Animations爲一組(我不知道他們是否嚴格同步,但我認爲他們是密切足夠的視覺的目的)。

+0

因此,您所建議的是將所有動畫一起運行爲一個小組,這樣我只需要手動停止和恢復一個而不是幾十個?這是一個好主意,但這對我所做的事不起作用,因爲我所有的CALayers都非常獨特地進行了動畫製作:-( – LampShade