2011-11-07 40 views
13

在我看來,第一次運行動畫(動畫UIView的框架,或CALayer的位置等),它是非常不連貫的,並且隨後的動畫是平滑的。爲什麼iOS動畫首次運行時會變慢?

什麼會導致這種情況,有什麼辦法預先緩存動畫?

注意:這個問題與這個問題非常相似:UIImageView animations lag at first run,但UIImages沒有被用在我的動畫中。

+0

您已經提到,這是[UIImageView的動畫滯後在第一次運行]重複(http://stackoverflow.com/questions/ 3382478 /的UIImageView的動畫LAG-AT-第一運行)。 – Moshe

+0

的確如此,我做到了。我想這不像我想象的那麼重複,因爲我沒有在動畫中處理UIImage。編輯問題的這一部分。 – ryleigh

+0

@ryleigh - 夠公平的。這是一個很好的問題,所以有一個upvote。 – Moshe

回答

0

假設您使用的是[UIImage imageNamed: @"herp.png"],圖像將被緩存。如果圖像被大量繪製,它將被解壓縮到內存中,否則會對圖像執行延遲加載並造成口吃。

+0

我所關心的動畫並未使用UIImages,但這很好理解。具體來說,在一個例子中,我從它的父項中移除一個UITextView,將它添加到另一個視圖,並使用'[UIView animate ...]'爲其框架設置動畫。 它第一次運行時會出現斷斷續續的情況,並且在它恢復原始視圖並且動畫再次觸發後,就會順利進行。 – ryleigh

+0

這包括渲染任何項目。如果文本從未編輯過,則只需渲染一次。這可能仍然會導致您的問題。但是,在閱讀完其他文章後,彈出式鍵盤很可能與您的鍵盤有關。 – Nico

0

運行它在viewDidAppear,而不是viewWillAppear。在圖像確實出現後應該會發生緩存,並且它看起來應該與用戶相同。

+0

那麼,我正在處理的動畫是對用戶輸入的迴應,所以當視圖出現時我無法正確播放它們。我使用了'viewWillAppear',因爲我希望在用戶看到它們之前有一些方法可以播放它們(這聽起來很愚蠢)。 – ryleigh

+0

奇數。您是使用[UIView beginAnimations]方法還是使用基於塊的[UIView animateWithDuration:動畫:...]方法?你有哪些動畫屬性?除了幀之外的任何東西什麼樣的對象有多少? – Tim

+0

嗯,在一種情況下,我從它的父項中移除一個UITextView,將它添加到另一個視圖,並使用[UIView animateWithDurationsEtc ...]爲其框架設置動畫。雖然在動畫播放的同時,鍵盤被召喚出來,所以我開始懷疑鍵盤的創建是導致動畫在這種情況下結結巴巴的原因。這是否有道理,鍵盤現在被緩存在某處,以便在下次需要時不必重新創建鍵盤?如果是這樣,有什麼方法可以預先初始化它嗎? – ryleigh

2

如果你有一個TextField,我認爲這是接收你的用戶輸入。使用UITextFieldDelegate方法Did而不是Should

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
//Do textfield animations and other view animations here

}

不要做你的動畫中;

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
//Don't do textfield animations and other view animations here
//This is where the system does its own animations; raising the keyboard, etc
}

+0

你的建議的技術原因是什麼?爲什麼動畫不能在「應該」中順利運行? –

相關問題