Swift筆記47:UIView 和 CALayer

構(gòu)建用戶界面,UIViewCALayer 是兩個核心概念。

1. 依賴關(guān)系
  • UIViewCALayer 之間存在相互依賴的關(guān)系。每個 UIView 內(nèi)部都有一個對應(yīng)的 CALayer,作為其內(nèi)容的呈現(xiàn)載體。UIView 依賴 CALayer 來繪制和顯示內(nèi)容,而 CALayer 依賴 UIView 提供的容器環(huán)境來展示這些內(nèi)容。
  • 代理關(guān)系:UIView 實現(xiàn)了 CALayerDelegate 協(xié)議,這意味著當(dāng)系統(tǒng)需要繪制 CALayer 的內(nèi)容時,實際上是 UIView 在幕后調(diào)用相關(guān)方法進行繪制。這種設(shè)計使得開發(fā)者可以在 UIView 的上下文中定制內(nèi)容繪制邏輯,同時利用 CALayer 的高效渲染能力。
2 框架和繼承
  • 兩者所屬的框架不同:UIView屬于UIKit框架,而CALayerQuartzCore框架下
  • UIView 繼承自 UIResponder,在UIResponder中定義了處理各種事件的事件傳遞接口。因此它可以響應(yīng)觸摸、手勢、鍵盤輸入等各種用戶交互事件,并通過委托、通知或閉包等方式將事件傳遞給應(yīng)用程序邏輯進行處理。
  • CALayer直接繼承NSObject,并沒有相應(yīng)的處理事件接口。
3 屬性和方法:
  • UIView:包含許多與用戶界面和事件處理相關(guān)的方法和屬性,如 addSubview:、backgroundColor、frame、bounds 等。 UIView 的視覺屬性(如背景色、邊框等)實際上是對內(nèi)部 CALayer 相關(guān)屬性的封裝。set/get UIView 的這些屬性時,實際上是在更改或者獲取 CALayer 的對應(yīng)屬性。UIView 提供了諸如 draw(_:) 方法(或 layoutSubviews())供子類重寫,以便自定義內(nèi)容的繪制。它還負責(zé)在內(nèi)容或?qū)傩宰兓瘯r更新其關(guān)聯(lián)的 CALayer,確保界面顯示的準(zhǔn)確性。
  • CALayer:提供與圖形直接相關(guān)的屬性,例如 contents(圖形內(nèi)容)、borderWidth、shadowOpacity 和 cornerRadius 等。一個CALayer的frame是由它的anchorPoint(錨點),position,bounds,和transform共同決定。CALayer 負責(zé)內(nèi)容的實際繪制,可以填充圖片、使用 Core Graphics 繪制圖形,或通過 contentsGravitymask 等屬性控制內(nèi)容的顯示方式。CALayer 提供了一系列屬性來控制視覺表現(xiàn),如背景色、邊框、圓角、陰影、透明度、變換(如旋轉(zhuǎn)、縮放)、濾鏡效果等。修改這些屬性可以即時改變視圖的外觀,且通常支持硬件加速。
4 層級結(jié)構(gòu)
  • UIView 是一個面向?qū)ο蟮目丶?,具有層級結(jié)構(gòu)??梢栽谄渲星短灼渌?UIView,形成視圖層次。每個視圖都可以響應(yīng)觸摸事件,形成響應(yīng)者鏈。
    CALayer 也有類似的層次結(jié)構(gòu),即子層(sublayers)的概念。UIView 的子視圖與其對應(yīng)的 CALayer 子層之間有一一對應(yīng)關(guān)系。它可以包含在視圖中,但不能獨立顯示(需要依附于 UIView)。
  • Layer 內(nèi)部維護著三分 layer tree,分別是 presentLayer Tree(動畫樹),modeLayer Tree(模型樹), Render Tree (渲染樹),在做 iOS動畫的時候,我們修改動畫的屬性,在動畫的其實是 Layer 的 presentLayer的屬性值,而最終展示在界面上的其實是提供 View的modelLayer
5 動畫
  • CALayer 支持基于 Core Animation 的簡單且高性能的動畫。通過修改其屬性并結(jié)合 CABasicAnimation、CAKeyframeAnimationCATransaction 等動畫類,可以輕松實現(xiàn)平移、旋轉(zhuǎn)、縮放、顏色漸變等動畫效果。

核心動畫的特點
1.核心動畫只作用在layer
2.核心動畫看到的都是假象,他并沒有去修改UIView的真實位置.其實是 Layer 的 presentLayer的屬性值,而最終展示在界面上的其實是提供 View的modelLayer。
3.當(dāng)不需要與用戶進行交互,使用核心動畫
4.當(dāng)要根據(jù)路徑做動畫時,使用核心動畫
5.當(dāng)做轉(zhuǎn)場動畫時,使用核心動畫(轉(zhuǎn)場類型比較多)

  • 隱式動畫
    CALayer 是默認修改屬性支持隱式動畫的,在給 UIView 的 Layer 做動畫的時候,View 作為 Layer 的代理,Layer 通過 actionForLayer:forKey:向 View請求相應(yīng)的 action(動畫行為)
    每個view都有一個layer,但是有一些不依附view單獨存在的layer,如CAShapelayer,它們不需要附加到view上就可以在屏幕上顯示內(nèi)容。
    基本上我們改變一個layer的任何一個屬性時,都會觸發(fā)一個從舊值到新值的簡單動畫,這就是所謂的隱式動畫。但是,當(dāng)layer附加到view中時,這個隱式動畫就不起作用了。
    UIView默認情況下禁止了layer動畫,但是在animation block中又重新啟用了它們。因為任何可動畫的layer屬性改變時,layer都會尋找并運行合適的action來實行這個改變,這個動畫在Core Animation中就是CAAction。
    layer通過向它的delegate發(fā)送actionForLayer:forKey:消息來詢問提供一個對應(yīng)屬性變化的action。
5 響應(yīng)鏈與生命周期
  • UIView 集成了完整的響應(yīng)鏈和視圖生命周期管理,包括加載、布局、顯示、隱藏、銷毀等階段。相比之下,CALayer 的生命周期相對簡單,主要關(guān)注內(nèi)容繪制和視覺效果。
6 性能
  • 在渲染復(fù)雜界面時,使用 CALayer 進行直接的圖形操作可以提供更高的性能。UIView 的交互和事件處理會涉及更多的開銷。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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