構(gòu)建用戶界面,UIView 和 CALayer 是兩個核心概念。
1. 依賴關(guān)系
-
UIView與CALayer之間存在相互依賴的關(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框架,而CALayer是QuartzCore框架下 -
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/getUIView的這些屬性時,實際上是在更改或者獲取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 繪制圖形,或通過contentsGravity、mask等屬性控制內(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、CAKeyframeAnimation或CATransaction等動畫類,可以輕松實現(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 的交互和事件處理會涉及更多的開銷。