CALayer屬于Core Animation,是呈現內容和動畫的層,以bitmap保存,資源消耗比較小。當展示一張圖片時,可以直接添加一張content為目標圖片的CALayer。
layer.contents = (__bridge id)image.CGImage;
Core Animation 分布如下:
圖形之所以能夠展現,皆可歸類于計算機圖形學。計算機圖形學是計算機產生對象圖形輸出的技術,更確切的說,是研究通過計算機將數據轉換為圖形,并在專門顯示設備上顯示的原理、方法和技術的學科。從圖中可以看出,最底層是圖形硬件(GPU);上層是OpenGL和CoreGraphics,提供一些接口來訪問GPU;再上層的CoreAnimation在此基礎上封裝了一套動畫的API。最上面的UIKit屬于應用層,處理與用戶的交互。
CALayer是Core Animation的基礎,layer tree是Core Animation 核心動畫執行過程中直接使用的對象。layer tree 分為 model layer tree(模型圖層樹) 、presentation layer tree(表示圖層樹) 、render layer tree(渲染圖層樹)。
這三個圖層在CALayer中可以使用的屬性有兩個,分別是: modelLayer (模型圖層)、presentationLayer(表現圖層)。渲染圖層在CALayer沒有提供直接的屬性給我們使用,是core Animation私有的。
模型圖層樹中的對象是應用程序與之交互的對象。此樹中的對象是存儲任何動畫的目標值的模型對象。每當更改圖層的屬性時,都使用其中一個對象,是用來存放數據的,包括layer賦值的各種屬性。
layer = layer.modelLayer
表示圖層樹中的對象包含任何正在運行的動畫的飛行中值。層樹對象包含動畫的目標值,而表示樹中的對象反映屏幕上顯示的當前值。您永遠不應該修改此樹中的對象。相反,您可以使用這些對象來讀取當前動畫值,也許是為了從這些值開始創建新動畫。
"表現圖層" 就是當前顯示在屏幕上的圖層。屏幕刷新時,就會調用presentationLayer。在core animation 動畫中,可以通過這個屬性,獲取動畫過程中每個時刻動畫圖層的數據,這樣如果在動畫過程中需要做什么處理,就可以動態的獲取layer上相關的數據了。動畫的過程中presentationLayer是時刻變化的,而modelLayer是不會變的。
self.layer != self.layer.presentationLayer
渲染圖層樹中的對象執行實際動畫,并且是Core Animation的私有動畫。
modelLayer 負責存儲動畫的目標值的模型對象。每當更改圖層的屬性時,它都會把數據存儲下來。當動畫開始執行時,屏幕上顯示的就是presentationLayer,動畫的過程中,你可以時刻訪問動態變化的數據。layer本身其實就是一個模型layer,只不過它擁有 presentationLayer。
CALayer的子類分布如下: