? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ????? ? iOS CALayer詳解
一、概述
在ios中,能看得見摸得到的東西基本都是UIView,比如一個按鈕、一個文本標簽、一個文本輸入框、一個圖標等等,這些都是UIView。其實UIView之所以能顯示在屏幕上,完全是因為其內(nèi)部的一個圖層,在創(chuàng)建UIView對象時,UIView內(nèi)部會自動創(chuàng)建一個圖層對象(即CALayer對象)。
當UIView需要顯示在屏幕上時,會調(diào)用drawRect方法進行繪圖,并且會將所有內(nèi)容繪制在自己的圖層上。繪圖完畢后,系統(tǒng)會將圖層拷貝到屏幕上,于是就完成了UIView的顯示。換言之,UIView本身不具備顯示的功能,是其內(nèi)部的圖層具有顯示功能。
通過操作CALayer對象,可以很方便的調(diào)整UIView的一些外觀屬性。比如陰影、圓角大小、邊框的寬度和顏色、還能給圖層添加動畫來實現(xiàn)一些比較炫酷的效果。
二、UIView與CALayer之間的區(qū)別
1、UIView相當于一個容器裝載著CALayer,可以處理用戶事件。直接繼承UIResponser。
2、CALayer是用來繪制內(nèi)容的,不能處理用戶事件。直接繼承NSObject。
3、UIView與CALayer是相互依賴的關系。UIView依賴于CALayer提供的內(nèi)容,CALayer依賴于UIView所提供的容器以用來顯示CALayer繪制的內(nèi)容。
三、CALayer的常用屬性

可以通過contents屬性給UIView設置背景圖片:

例如,我們利用CALayer對圖片的顯示進行處理:

運行效果如下:

看上面的代碼,我們明明添加了陰影,為什么沒有出來呢?那是因為陰影效果和圓角裁剪發(fā)生了沖突,如果設置了圓角裁剪,那么陰影效果將不會出現(xiàn)。當注釋掉圓角裁剪時,陰影效果才會展示,如下所示:

四、position和anchorPoint屬性
CALayer有兩個重要的屬性:position和anchorPoint。
position屬性:
(1)用來設置CALayer在父層中的位置.
(2)以父層的左上角為原點(0,0).
anchorPoint屬性:
(1)稱為"定位點"、"錨點"、控件旋轉動畫圍繞著該點旋轉.
(2)以自己的左上角為原點(0,0).
(3)它的x,y取值都是(0~1),默認值是(0.5,0.5),即默認是中點.
(4)決定著CALayer上的哪個點會在position的位置(即設置的錨點會移動到position點的位置)
五、隱式動畫
每一個UIView內(nèi)部都默認關聯(lián)著一個CALayer,我們稱這個Layer為RootLayer(根層),所有的非RootLayer對象,都存在隱式動畫(即系統(tǒng)自帶的一些效果)。
當對非RootLayer的部分屬性進行修改時,默認會產(chǎn)生一些動畫效果,而這部分屬性稱為AnimatableProperties(可動畫屬性).
列舉幾個常見的AnimatableProperties:
bounds:用于設置CALayer的寬度和高度,修改該屬性會產(chǎn)生縮放動畫。
backgroundColor:用于設置CALayer的背景顏色,修改該屬性會產(chǎn)生背景色的漸變動畫。
position:用于設置CALayer的位置,修改該屬性會產(chǎn)生平移動畫。
可以通過動畫事務(CATransation)關閉默認的隱式動畫:
