2011-12-31 33 views
52

我提到的DOC,它說:究竟做布爾參數做animateWithDuration:動畫:完成:

完成
...此塊沒有返回值,並接受一個布爾該參數指示在調用完成處理程序之前動畫是否實際完成。 ...

但是我發現沒有使用布爾參數或沒有事,completion:塊總會後animations:塊執行。就像下面顯示的兩個簡單的基於塊的動畫代碼片段一樣,它們兩個都是一樣的。

[UIView animateWithDuration:0.3f 
        delay:0.0f 
       options:UIViewAnimationCurveEaseInOut 
      animations:^{ 
       [myView setAlpha:0.0f]; 
      } 
      completion:^(BOOL finished) { 
       [myView removeFromSuperview]; 
      }]; 

[UIView animateWithDuration:0.3f 
        delay:0.0f 
       options:UIViewAnimationCurveEaseInOut 
      animations:^{ 
       [myView setAlpha:0.0f]; 
      } 
      completion:^(BOOL finished) { 
       if (finished) [myView removeFromSuperview]; 
      }]; 

而且我發現,大多數人(包括我)使用第一個(甚至是蘋果的官方文檔例子)。所以,

  • 什麼是finished參數用於這裏?
  • 或者情況會怎樣?
+1

偉大的問題,我從來沒有真正想知道這件事,直到我的代碼今天創建引起驚厥的動畫。感謝您提出這個問題! – 2016-06-01 19:00:51

回答

76

完成的參數是NO時的動畫效果被取消:通常情況下,當你已經中斷動畫開始播放另一個(例如,你已經開始了新的動畫,當前一個結束之前,與參數從當前狀態開始)或者您已經直接取消了動畫。

實際上這會取消當前的動畫,但完成塊仍然被調用。如果您要鏈接一系列動畫,您會希望鏈條停止,因此您只會繼續完成前一個動畫的鏈接。

舉一個例子,假設你有一個遊戲,炸彈在屏幕上飛行。如果用戶沒有敲擊炸彈,它會在到達邊緣時爆炸。所以你有一個動畫來移動炸彈,而你的完成塊會有另一個動畫來顯示爆炸,也可能是一個調用某種方法來降低分數的東西。

如果用戶點擊炸彈,您將取消移動動畫,並讓炸彈無害地飛走。您的原始完成塊仍然會被執行,所以您需要知道動畫是自己完成還是被取消。

+1

感謝您的回答! 「_you已經中斷了動畫以啓動另一個one_」,這可能是使用此參數的情況!但你能提供一個簡單的例子嗎? :p「_如果你鏈接了一系列動畫,你會希望該鏈停止,所以你只會繼續前一個動畫的鏈完成_」,但它不會繼續動畫鏈,直到前一個動畫完成沒有'finished'參數。我通過這種方式(沒有'if'語句)在我的應用程序中執行動畫序列並且沒有任何錯誤的順序錯誤。 – Kjuly 2011-12-31 11:06:59

+6

我已經添加了一個簡單的例子。 – jrturton 2011-12-31 12:13:26

+0

一個有趣而清晰的例子!謝謝! – Kjuly 2011-12-31 13:36:12