iOS中的轉場研究(1)

kid143發表於2014-11-11

場景轉換是iOS開發中最基本的需求。為了讓自己的App更加的酷炫,我們往往需要定製一些轉場效果。在iOS中,可以通過多種方式設定轉場效果。這裡簡單列表如下:

  • Modal presentation

    1. 設定ViewController的modalTransitionStyle屬性。
      這種方式也對應Storyboard中對應的segue transition的設定。這個屬性是一個列舉型別,其值代表已經定製的幾種轉場風格。這種方式也是最簡單的轉場,不帶有任何自定義的轉場效果程式碼。
    2. 使用UIView的animation API實現自定義的動畫。
      這種方式是比較常見實現方式。除了官方的文件以外,大量的Blog文章都會詳細講解這些API的用法。UIView的animation API的使用比較直觀,相對來說也是一種比較容易學習的動畫實現方式。
  • Navigation View Controller presentation

    1. 使用UIView的animation API。
      與Modal presentation相同,儘管在Storyboard中有專門為Navigation View Controller定製的Push segue(iOS8中被Show segue取代,因為後者支援iOS8中引進的Adaptive AutoLayout),但是Push segue並沒有transtion屬性,所以如果需要定製轉場效果,可以使用UIVIew,使用方法和Modal presentation相同。
    2. 使用CATransition類。
      CATransition看起來更像為Navigation View Controller和TabBar View Controller這樣的容器Controller定製的轉場效果類。提供了很多內建的的動畫效果。CATransition還可以結合CoreImage的濾鏡CIFilter共同實現很炫的場景轉換。若想詳細瞭解CATransition的用法,可以讀一讀蘋果的文件

我們注意到,轉場往往發生在流程切換的時候。所以上面的轉場效果程式碼,往往會放在自定義的轉場方法中(多見於使用Nib開發)或放在自定義的UIStoryboardSegue類中(多見於使用Storyboard開發)。所以很多時候,我們往往會碰到原生的轉場方法與定製的動畫效果有一定衝突。因為像presentViewController:animated:completion:這類方法本身就自帶有內建的動畫效果,自定義的動畫效果往往在這個方法之外。所以很多時候需要用一些trick來避免這些問題。因此程式碼的可讀性往往不會很好,並且寫的不好的時候還會帶來效率方面的問題。

iOS7以後,蘋果引進了新的Transition API。這些API的使用方式,蘋果沒有給出一個官方的Guide,但是在網上,已經有很多Blog和教程講解如何使用這些API,比如這篇文章
新的Transition API完全改變了上面提到的動畫與原生轉場介面不相容的問題。在新的API中,我們可以將動畫效果程式碼單獨封裝到animator物件中,在設定好View Controller的transitoningDelegate後,再呼叫原生的轉場方法,就會自動使用定製的動畫效果。考慮到現在大部分App已經逐漸放棄了對iOS6的支援,所以這種方法是目前推薦的轉場效果定製方法。單獨封裝的動畫效果類在程式碼管理上也更加方便。

這裡需要注意的一點,iOS6中引入的Storyboard Unwind Segue往往都需要一個Container View Controller。一個很常見的問題就是新手在定製Segue的時候往往會發生自定義的Unwind Segue不起作用。這個問題一般都是由於沒有正確實現Container View Controller所需的方法帶來的。我將在下篇文章討論這個問題。

相關文章