巨妖有圖層,洋蔥也有圖層,你有嗎?咱們都有圖層 -- 史萊克 git
Core Animation實際上是一個使人誤解的命名。你可能認爲它只是用來作動畫的,但實際上它是從一個叫作Layer Kit這麼一個不怎麼和動畫有關的名字演變而來,因此作動畫這只是Core Animation特性的冰山一角。 github
Core Animation是一個複合引擎,它的職責就是儘量快地組合屏幕上不一樣的可視內容,這個內容是被分解成獨立的圖層,存儲在一個叫作圖層樹的體系之中。因而這個樹造成了UIKit以及在iOS應用程序當中你所能在屏幕上看見的一切的基礎。 框架
在咱們討論動畫以前,咱們將從圖層樹開始,涉及一下Core Animation的靜態組合以及佈局特性。 佈局
若是你曾經在iOS或者Mac OS平臺上寫過應用程序,你可能會對視圖的概念比較熟悉。一個視圖就是在屏幕上顯示的一個矩形塊(好比圖片,文字或者視頻),它可以攔截相似於鼠標點擊或者觸摸手勢等用戶輸入。視圖在層級關係中能夠互相嵌套,一個視圖能夠管理它的全部子視圖的位置。圖1.1顯示了一種典型的視圖層級關係 性能
圖1.1 一種典型的iOS屏幕(左邊)和造成視圖的層級關係(右邊) 動畫
在iOS當中,全部的視圖都從一個叫作UIVIew的基類派生而來,UIView能夠處理觸摸事件,能夠支持基於Core Graphics繪圖,能夠作仿射變換(例如旋轉或者縮放),或者簡單的相似於滑動或者漸變的動畫。 spa
CALayer類在概念上和UIView相似,一樣也是一些被層級關係樹管理的矩形塊,一樣也能夠包含一些內容(像圖片,文本或者背景色),管理子圖層的位置。它們有一些方法和屬性用來作動畫和變換。和UIView最大的不一樣是CALayer不處理用戶的交互。 視頻
CALayer並不清楚具體的響應鏈(iOS經過視圖層級關係用來傳送觸摸事件的機制),因而它並不可以響應事件,即便它提供了一些方法來判斷是否一個觸點在圖層的範圍以內(具體見第三章,「圖層的幾何學」) 接口
每個UIview都有一個CALayer實例的圖層屬性,也就是所謂的backing layer,視圖的職責就是建立並管理這個圖層,以確保當子視圖在層級關係中添加或者被移除的時候,他們關聯的圖層也一樣對應在層級關係樹當中有相同的操做(見圖1.2)。 事件
圖1.2 圖層的樹狀結構(左邊)以及對應的視圖層級(右邊)
實際上這些背後關聯的圖層纔是真正用來在屏幕上顯示和作動畫,UIView僅僅是對它的一個封裝,提供了一些iOS相似於處理觸摸的具體功能,以及Core Animation底層方法的高級接口。
可是爲何iOS要基於UIView和CALayer提供兩個平行的層級關係呢?爲何不用一個簡單的層級來處理全部事情呢?緣由在於要作職責分離,這樣也能避免不少重複代碼。在iOS和Mac OS兩個平臺上,事件和用戶交互有不少地方的不一樣,基於多點觸控的用戶界面和基於鼠標鍵盤有着本質的區別,這就是爲何iOS有UIKit和UIView,可是Mac OS有AppKit和NSView的緣由。他們功能上很類似,可是在實現上有着顯著的區別。
繪圖,佈局和動畫,相比之下就是相似Mac筆記本和桌面系列同樣應用於iPhone和iPad觸屏的概念。把這種功能的邏輯分開並應用到獨立的Core Animation框架,蘋果就可以在iOS和Mac OS之間共享代碼,使得對蘋果本身的OS開發團隊和第三方開發者去開發兩個平臺的應用更加便捷。
實際上,這裏並非兩個層級關係,而是四個,每個都扮演不一樣的角色,除了視圖層級和圖層樹以外,還存在呈現樹和渲染樹,將在第七章「隱式動畫」和第十二章「性能調優」分別討論。