iOS CALayer (圖層的相關(guān)知識)

CALayer簡介

  1. 在iOS中,你能看得見摸得著的東西基本上都是UIView,比如一個按鈕、一個文本標(biāo)簽、一個文本輸入框、一個圖標(biāo)等等,這些都是UIView。
  1. 其實(shí)UIView之所以能顯示在屏幕上,完全是因?yàn)樗鼉?nèi)部的一個圖層,在創(chuàng)建UIView對象時,UIView內(nèi)部會自動創(chuàng)建一個圖層(即CALayer對象),通過UIView的layer屬性可以訪問這個層
    @property(nonatomic,readonly,retain) CALayer *layer;
  2. 當(dāng)UIView需要顯示到屏幕上時,會調(diào)用drawRect:方法進(jìn)行繪圖,并且會將所有內(nèi)容繪制在自己的圖層上,繪圖完畢后,系統(tǒng)會將圖層拷貝到屏幕上,于是就完成了UIView的顯示
  3. 換句話說,UIView本身不具備顯示的功能,擁有顯示功能的是它內(nèi)部的圖層。

在iOS中CALayer的設(shè)計主要是了為了內(nèi)容展示和動畫操作,CALayer本身并不包含在UIKit中,它不能響應(yīng)事件。由于CALayer在設(shè)計之初就考慮它的動畫操作功能,CALayer很多屬性在修改時都能形成動畫效果,這種屬性稱為“隱式動畫屬性”。但是對于UIView的根圖層而言屬性的修改并不形成動畫效果,因?yàn)楹芏嗲闆r下根圖層更多的充當(dāng)容器的做用,如果它的屬性變動形成動畫效果會直接影響子圖層。另外,UIView的根圖層創(chuàng)建工作完全由iOS負(fù)責(zé)完成,無法重新創(chuàng)建,但是可以往根圖層中添加子圖層或移除子圖層。


CALayer與UIView的區(qū)別

1.UIView可以響應(yīng)事件,Layer不可以.

  1. UIKit使用UIResponder作為響應(yīng)對象,來響應(yīng)系統(tǒng)傳遞過來的事件并進(jìn)行處理。UIApplication、UIViewController、UIView、和所有從UIView派生出來的UIKit類(包括UIWindow)都直接或間接地繼承自UIResponder類。在 UIResponder中定義了處理各種事件和事件傳遞的接口。
  1. CALayer直接繼承 NSObject,并沒有相應(yīng)的處理事件的接口。

2.View和CALayer的Frame映射

  1. 一個 Layer 的 frame 是由它的 anchorPoint,position,bounds,和 transform 共同決定的,而一個 View 的 frame 只是簡單的返回 Layer的 frame,同樣 View 的 center和 bounds 也是返回 Layer 的一些屬性。(一會兒解析屬性的時候會再做比較)
  1. 對于frame的理解請看這里
  2. UIView主要是對顯示內(nèi)容的管理而 CALayer 主要側(cè)重顯示內(nèi)容的繪制。
  3. 在做 iOS 動畫的時候,修改非 RootLayer的屬性(譬如位置、背景色等)會默認(rèn)產(chǎn)生隱式動畫,而修改UIView則不會。

CALayer的基本屬性

CALayer的屬性.jpg

屬性解釋:

1. position

layer在父視圖上的相對坐標(biāo):(計算公式)

position.x = frame.origin.x + anchorPoint.x * bounds.size.width;  
position.y = frame.origin.y + anchorPoint.y * bounds.size.height;

2. anchorPoint (錨點(diǎn))

錨點(diǎn)指定的是自身(本Layer)哪個位置出現(xiàn)在父視圖的position點(diǎn)
取值范圍為[0,1];
可以參考這里更好理解anchorPoint

3. CornerRadius(圓角半徑)

可以設(shè)置四周的圓角,配合maskToBounds = YES;裁切成圓矩形或圓
但是一般裁切圓角我們不這么用,因?yàn)樘貏e耗費(fèi)性能;
關(guān)于切圓角更詳細(xì)的敘述,請查看這篇文章:《Quartz 2D 手勢 截圖 動畫小demo》

4.mask

  1. 其實(shí)就是一個遮罩,一般來說,給UIView或者CALayer做Mask只需要用一個CAShapeLayer來充當(dāng)CALayer或者UIView.layer的mask屬性就好了(當(dāng)然你也可以用別的炫酷的CALayer子類來當(dāng)mask,比如說CATextLayer一會兒會分別講到)。
  1. mask作為CALayer的屬性,它本身也是一個CALayer,但是作為mask,最重要的是它的輪廓形狀,Color是無關(guān)緊要的

5.transfrom

  1. transform : 是結(jié)合 anchorPoint(錨點(diǎn))的位置來對圖層和圖層上的子圖層進(jìn)行變化。
  1. sublayerTransform:是結(jié)合anchorPoint(錨點(diǎn))的位置來對圖層的子圖層進(jìn)行變化,不包括本身。
  2. CATransform3DIdentity 是單位矩陣,該矩陣沒有縮放,旋轉(zhuǎn),歪斜,透視。該矩陣應(yīng)用到圖層上,就是設(shè)置默認(rèn)值。CATransform3DIdentity查看詳細(xì)筆記請看這里

CALayer的一些特殊的子類

CAShapeLayer

CAShapeLayer是一個通過矢量圖形而不是bitmap來繪制的圖層子類。你指定諸如顏色和線寬等屬性,用CGPath來定義想要繪制的圖形,最后CAShapeLayer就自動渲染出來了。當(dāng)然,你也可以用Core Graphics直接向原始的CALyer的內(nèi)容中繪制一個路徑,相比直下,使用CAShapeLayer有以下一些優(yōu)點(diǎn):

  1. 渲染快速。CAShapeLayer使用了硬件加速,繪制同一圖形會比用Core Graphics快很多。
  2. 高效使用內(nèi)存。一個CAShapeLayer不需要像普通CALayer一樣創(chuàng)建一個寄宿圖形,所以無論有多大,都不會占用太多的內(nèi)存。
    不會被圖層邊界剪裁掉。一個CAShapeLayer可以在邊界之外繪制。你的圖層路徑不會像在使用Core Graphics的普通CALayer一樣被剪裁掉。
  3. 不會出現(xiàn)像素化。當(dāng)你給CAShapeLayer做3D變換時,它不像一個有寄宿圖的普通圖層一樣變得像素化。
    詳細(xì)講解CAShapeLayer

其他子類知識請點(diǎn)擊這里

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容