CALayer屬于Core Animation,是呈現(xiàn)內(nèi)容和動畫的層,以bitmap保存,資源消耗比較小。當展示一張圖片時,可以直接添加一張content為目標圖片的CALayer。
layer.contents = (__bridge id)image.CGImage;
Core Animation 分布如下:

圖形之所以能夠展現(xiàn),皆可歸類于計算機圖形學。計算機圖形學是計算機產(chǎn)生對象圖形輸出的技術(shù),更確切的說,是研究通過計算機將數(shù)據(jù)轉(zhuǎn)換為圖形,并在專門顯示設(shè)備上顯示的原理、方法和技術(shù)的學科。從圖中可以看出,最底層是圖形硬件(GPU);上層是OpenGL和CoreGraphics,提供一些接口來訪問GPU;再上層的CoreAnimation在此基礎(chǔ)上封裝了一套動畫的API。最上面的UIKit屬于應(yīng)用層,處理與用戶的交互。
CALayer是Core Animation的基礎(chǔ),layer tree是Core Animation 核心動畫執(zhí)行過程中直接使用的對象。layer tree 分為 model layer tree(模型圖層樹) 、presentation layer tree(表示圖層樹) 、render layer tree(渲染圖層樹)。

這三個圖層在CALayer中可以使用的屬性有兩個,分別是: modelLayer (模型圖層)、presentationLayer(表現(xiàn)圖層)。渲染圖層在CALayer沒有提供直接的屬性給我們使用,是core Animation私有的。
模型圖層樹中的對象是應(yīng)用程序與之交互的對象。此樹中的對象是存儲任何動畫的目標值的模型對象。每當更改圖層的屬性時,都使用其中一個對象,是用來存放數(shù)據(jù)的,包括layer賦值的各種屬性。
layer = layer.modelLayer
表示圖層樹中的對象包含任何正在運行的動畫的飛行中值。層樹對象包含動畫的目標值,而表示樹中的對象反映屏幕上顯示的當前值。您永遠不應(yīng)該修改此樹中的對象。相反,您可以使用這些對象來讀取當前動畫值,也許是為了從這些值開始創(chuàng)建新動畫。
"表現(xiàn)圖層" 就是當前顯示在屏幕上的圖層。屏幕刷新時,就會調(diào)用presentationLayer。在core animation 動畫中,可以通過這個屬性,獲取動畫過程中每個時刻動畫圖層的數(shù)據(jù),這樣如果在動畫過程中需要做什么處理,就可以動態(tài)的獲取layer上相關(guān)的數(shù)據(jù)了。動畫的過程中presentationLayer是時刻變化的,而modelLayer是不會變的。
self.layer != self.layer.presentationLayer
渲染圖層樹中的對象執(zhí)行實際動畫,并且是Core Animation的私有動畫。
modelLayer 負責存儲動畫的目標值的模型對象。每當更改圖層的屬性時,它都會把數(shù)據(jù)存儲下來。當動畫開始執(zhí)行時,屏幕上顯示的就是presentationLayer,動畫的過程中,你可以時刻訪問動態(tài)變化的數(shù)據(jù)。layer本身其實就是一個模型layer,只不過它擁有 presentationLayer。
CALayer的子類分布如下:
