Core Animation編程指南
Core Animation是一個Objc類庫,用于處理圖像渲染,投射和動畫。
它提供以下功能:
通過簡單的編程模型提供高性能的合成效果。
基于熟悉的視圖抽象,可以使用樹狀的對象體系創建復雜的用戶界面
輕量的數據結構。可以同時對上百個層進行展示和動畫。
抽象的動畫接口,能夠讓動畫運行在獨立的線程。一旦動畫配制完畢并啟動后,Core Animation將負責它的運行和楨速。
提升應用程序性能。程序只需要在變化時重畫。將應用程序在resize時需要做的處理降到最低并提供layout服務層,Core Animation讓你不再需要手動處理楨速。
靈活的layout管理器模型,自帶的管理器能讓你指定層和其兄弟層的相對位置和大小。
使用 Core Animation,開發者不再需要底層圖形接口就可以創建高性能的動態用戶界面了。
Core Animation類體系

Core Animation類圖Core Animation的類可分為以下幾組:
提供展示的內容的Layer類
Animation 和 timing 類
Layout 和 constraint 類
將多個修改合成一個原子更新操作的事務類
基本的 Core Animatin 類包含在 Quartz Core 框架中,也有另外的layer類在其他框架中定義。下圖展示了 Core Animation 的類體系。
CALayer
CALayer 是Core Animation的基礎,它的作用類似于 NSView 。每一個 CALayer 可以擁有一個父層和多個子層,由此形成一個樹狀結構的體系,叫做 layer tree。
層從后往前的順序進行渲染,子層基于和父層相對的局部坐標系統。還可以對層進行矩陣轉換以實現復雜的展示效果.
在 CALayer 中,除了繼承還有多種方式可以為它提供顯示的內容,這一點有別于其他視圖類:
把層的 content 屬性設置為Core Graphics image,或者代理
提供代理對Core Graphics image context進行畫圖
設置層公用的一些可視化屬性,比如背景色,透明度等
Subclassing CALayer and implementing any of the above techniques in a more encapsulated manner.
動畫和時間函數
層的很多可視屬性都可以產生隱式動畫,這些屬性稱為可動畫屬性,修改層的可動畫屬性自動就會產生從當前值變化到目標值的動畫,比如設置層的hidden屬性為YES,就會產生一個淡出的動畫。大部分可動畫屬性都有默認的動畫,這些動畫也是可以定制的。
可動畫屬性也可以進行顯式動畫,要創建顯式動畫你可以創建Core Animation動畫類的實例并指定視覺效果,顯式動畫不會修改層對象的屬性值,它僅僅是展示動畫效果而已。
Core Animation既提供基本動畫也提供關鍵楨動畫,你可以對層的整個內容進行動畫也可以對部分屬性進行動畫。所有動畫類都繼承自抽象類 CAAnimation 。 CAAnimation 遵守 CAMediaTiming 協議,可以對動畫進行簡單的時長,速度,重復次數控制。它還遵守 CAAction 協議,可以讓動畫在層觸發action時啟動.
動畫類還定義了描述動畫速度的基于簡單bezier曲線的時間函數。比如ease-out時間函數會讓動畫在快結束的時候減速。
Core Animation提供了許多或具體或抽象的動畫類:
CATransition 提供作用于整個層的轉換效果。你還可以通過自定義的Core Image filter擴展轉換效果。
CAAnimationGroup 可以打包多個動畫對象并讓他們同時執行。
CAPropertyAnimation 支持基于屬性關鍵路徑的動畫。
CABasicAnimation 對屬性做簡單的插值
CAKeyframeAnimation 對關鍵楨動畫提供支持。指定需要動畫屬性的關鍵路徑,一個表示每一個階段對應的值的數組,還有一個關鍵楨時間和時間函數的數組。動畫運行時,依次設置每一個值的指定插值。
Layout管理類
Mac OS X 的 Core Animation 還提供更靈活的機制可以讓你自己編寫自定義的 layout 管理器。
Core Animation 的 CAConstraint 類是個layout管理器,它根據你指定的約束條件對子層進行排列。每一個約束條件(封裝在 CAConstraint 類的實例中)描述層和兄弟層或父層之間的幾何屬性的關系。
事務管理類
對可動畫屬性的任何修改都應該在事務中完成。 CATransition 類負責將多個動畫操作打包成原子更新操作然后執行。支持嵌套事務。
Core Animation 支持兩種事務:隱式和顯式。在當前沒有事務的情況下對可動畫屬性進行修改會自動創建一個隱式的事務,在當前線程下一次迭代時自動提交。要創建顯式事務,在對層進行修改之前給 CATransition 類發一個 begin 消息,修改后再發一個 commit 消息。