2012-05-15 40 views
2

我在我的應用程序中使用動畫並感到困惑,因爲動畫在設備上滯後,模擬器上一切似乎都沒問題。首先,我試圖用UIView動畫滯後於設備

[UIView beginAnimations:nil context:nil]; 
[UIView setAnimationDuration:0.3]; 
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut]; 

而在此之前提交的動畫有類似〜30行代碼以「如果」塊所以我想這可能引起問題,但後來我開始使用

[UIView animateWithDuration:0.3 
            delay:0.0 
           options: UIViewAnimationCurveEaseIn 
          animations:^{ 
           mainView.frame = CGRectMake(0, 0, 320, 420); 
           buttonsView.transform = CGAffineTransformMakeTranslation(0, 68); 
           radioBar.transform = CGAffineTransformMakeTranslation(0, -50); 
           vk_controller.view.frame = CGRectMake(0, 0, 320, 440); 
          } 
          completion:^(BOOL finished){ 
           button.isHiddenDown = YES; 
          }]; 

以「if」爲單位,但滯後似乎留下來。當我按下按鈕時,延遲〜0.5-1秒(爲什麼?),然後開始動畫。但是當我在桌上查看

[UIView animateWithDuration:0.3 
            delay:0.0 
           options: UIViewAnimationCurveEaseIn 
          animations:^{ 
           mainView.frame = CGRectMake(0, 0, 320, 420); 
           buttonsView.transform = CGAffineTransformMakeTranslation(0, 68); 
           radioBar.transform = CGAffineTransformMakeTranslation(0, -50); 
           goha_news_controller.view.frame = CGRectMake(0, 0, 320, 420); 
           goha_news_controller.feed_table.frame = CGRectMake(0, 0, 320, 420); 
           if(goha_news_controller.backgroundView) 
           { 
            goha_news_controller.backgroundView.frame = CGRectMake(0, 0, 320, 420); 
            goha_news_controller.newsDetailView.frame = CGRectMake(0, 0, 320, 420); 
           } 

          } 
          completion:^(BOOL finished){ 
           button.isHiddenDown = YES; 
          }]; 

除了在動畫之前出現意外的延遲之外,還有帶陣陣的粗糙動畫。
任何人都可以解釋爲什麼會發生,我該如何解決它?

+0

您是否同時啓動多個動畫?而通過多個動畫我的意思是多個[UIView動畫...]在同一個方法? – Dabrut

+0

不,只有1個動畫塊在同一時間 – Aft3rmath

+0

我拿起了確實有多個代碼的代碼。爲什麼這不好? – cynistersix

回答

5

另一個可能的原因。你是否在任何屏幕視圖或圖層中使用陰影? iOS不能很好地處理陰影動畫。

+0

是的,在表格視圖中,圖像視圖圖層上有陰影。我必須刪除它嗎?當我在沒有陰影的視圖上進行動畫時,沒有刺耳的動作,但按下按鈕和動畫之間的延遲時間約爲0.5-0.8秒 – Aft3rmath

+0

哦,等等,我使用陰影來表示上下欄,必須保留每個視圖,必須檢查它是問題的原因 – Aft3rmath

+0

是的,你是對的,一切看起來都不錯,但性能卻很醜陋;]沒有高性能的替代品來製造陰影?或者這部分必須由設計師創建? – Aft3rmath

1

您不能使用模擬器來衡量性能。它具有與設備完全不同(不僅僅是更好或更差)的性能特徵(並且設備也不同於一代代)。

如果語句不會導致顯着的延遲;他們很便宜。

您的表現問題可能在別處。我看不到您向我們顯示的代碼中的任何內容,看起來像是一個明顯的性能問題。

1

如果您在動畫時調整控件中的圖像大小,這可能會導致滯後,因爲圖像大小調整對於CPU而言是非常昂貴的過程。在運行動畫和更改圖像之前,您應該製作圖像的縮略圖。

此外,嘗試使用開始動畫 - 提交動畫,而不是使用塊的動畫。

[UIView beginAnimations:nil context:nil]; 
[UIView setAnimationDuration:0.75]; 
// Here some more animation settings 
// Here your animations 
[UIView commitAnimations]; 
+1

我同意你的帖子關於調整圖像大小。但是,爲什麼使用beginAnimations:context:/ commitAnimations?新的基於塊的動畫在我的經驗中工作得非常好,並且通常更清潔且更易於使用。此外,蘋果不鼓勵在iOS 4.0和更高版本中使用舊版本風格 –

+0

@DuncanC我完全同意,塊動畫非常乾淨,無法使用setAnimationDidStopSelector,而且完成塊比創建新方法容易得多:@( SEL) –

+0

我之前使用過開始動畫,但是我決定將它替換爲5個動畫塊(對於每個視圖控制器)以避免在1個動畫中出現許多幀重畫,但它根本沒有任何幫助。我不調整圖像大小,調整視圖大小,調整視圖大小並將切換調整到上下欄 – Aft3rmath