前言
強(qiáng)大的UIView是基于 CALayer實(shí)現(xiàn)的造烁,它的重要性不言而喻搞动,相信大家也都有自己的研究和理解,今天這片文章里的內(nèi)容是幾個(gè)關(guān)鍵點(diǎn)的補(bǔ)充驮履。
CALayer 和 UIView的關(guān)系
CALayer是Core Animation的基礎(chǔ),UIKit 相關(guān)內(nèi)容實(shí)現(xiàn)的基礎(chǔ)
簡(jiǎn)單來說鱼辙,View和Layer最大的區(qū)別就是View可以接受用戶輸入(例如觸摸)而Layer不可以,Layer單獨(dú)并不能呈現(xiàn)出任何可視的內(nèi)容玫镐,必須依托于View倒戏。Layer只是幾何上呈現(xiàn)給用戶的東西,它較為輕量恐似,通常采用Cache技術(shù)杜跷,對(duì)資源消耗也較小。
CALayer是什么矫夷?
摘自官網(wǎng)的一句話-Layers Provide the Basis for Drawing and Animations(Layers是繪圖和動(dòng)畫的基礎(chǔ))
Layer是在3D空間中的2D平面葛闷。Layer管理的幾何(例如rotate,transfrom)双藕,內(nèi)容(image等)淑趾,和可視屬性(backgroundColor,alpha)等信息忧陪。Layer主要通過管理bitmap來維護(hù)自己的狀態(tài)信息扣泊,從這一點(diǎn)上來說,Layer可以看作對(duì)象模型嘶摊,因?yàn)樗麄冎饕脕砉芾頂?shù)據(jù)旷赖。
Layer是基于bitmap的,它會(huì)捕獲View要呈現(xiàn)的內(nèi)容更卒,然后cache在一個(gè)bitmap中等孵,這個(gè)bitmap可以看作一個(gè)對(duì)象。這樣每次進(jìn)行操作蹂空,例如平移旋轉(zhuǎn)等俯萌,只是bitmap的矩陣運(yùn)算∩险恚基于Layer的動(dòng)畫過程如圖
由于基于Layer的繪制是處理靜態(tài)的Bitmap的咐熙,而bitmap的處理又是GPU所擅長(zhǎng)的,所以它的效率要比基于View繪制的高很多辨萍,因?yàn)榛赩iew繪制的每次都要進(jìn)行drawRect的調(diào)用重新繪制棋恼。
** Layer支持繼承返弹,支持添加Sublayer,支持對(duì)sublayer進(jìn)行層次調(diào)整**
常用的Layer子類
CAEmitterLayer 發(fā)射器層爪飘,用來控制粒子效果
CAGradientLayer 梯度層义起,顏色漸變
CAEAGLayer 用OpenGL ES繪制的層
CAReplicationLayer 用來自動(dòng)復(fù)制sublayer
CAScrollLayer 用來管理可滑動(dòng)的區(qū)域
CAShapeLayer 繪制立體的貝塞爾曲線
CATextLayer 可以繪制AttributeString
CATiledLayer用來管理一副可以被分割的大圖
CATransformLayer 用來渲染3D layer的層次結(jié)構(gòu)
管理Layer內(nèi)容的幾個(gè)函數(shù)
addSublayer:
insertSublayer:above:
insertSublayer:atIndex:
insertSublayer:below:
removeFromSuperlayer
replaceSublayer:with:
** anchorPoint和position**
和UIView不同,Layer主要由三個(gè)屬性來設(shè)置位置(極少用Frame):
bounds - 設(shè)置大小
anchorPoint -設(shè)置錨點(diǎn)(錨點(diǎn)對(duì)后續(xù)的layer動(dòng)畫有很大影響,默認(rèn)(0.5师崎,0.5))
position - 錨點(diǎn)在superLayer中的位置
contentGravity這個(gè)屬性默终。這個(gè)屬性決定了contents如何填充。
具體分為兩個(gè)方面犁罩,
方面一齐蔽,位置方面具體如圖
方面二,比例變換方面如圖
一些實(shí)例效果
(未完待續(xù)......)