構(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)方法進(jìn)行繪制。這種設(shè)計使得開發(fā)者可以在UIView
的上下文中定制內(nèi)容繪制邏輯南用,同時利用CALayer
的高效渲染能力膀钠。
2 框架和繼承
- 兩者所屬的框架不同:
UIView
屬于UIKit
框架,而CALayer
是QuartzCore
框架下 -
UIView
繼承自UIResponder
,在UIResponder
中定義了處理各種事件的事件傳遞接口裹虫。因此它可以響應(yīng)觸摸肿嘲、手勢、鍵盤輸入等各種用戶交互事件筑公,并通過委托雳窟、通知或閉包等方式將事件傳遞給應(yīng)用程序邏輯進(jìn)行處理。 -
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)容的繪制。它還負(fù)責(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
負(fù)責(zé)內(nèi)容的實際繪制方妖,可以填充圖片狭魂、使用 Core Graphics 繪制圖形,或通過contentsGravity
、mask
等屬性控制內(nèi)容的顯示方式雌澄。CALayer
提供了一系列屬性來控制視覺表現(xiàn)斋泄,如背景色、邊框掷伙、圓角是己、陰影、透明度任柜、變換(如旋轉(zhuǎn)卒废、縮放)、濾鏡效果等宙地。修改這些屬性可以即時改變視圖的外觀摔认,且通常支持硬件加速。
4 層級結(jié)構(gòu)
-
UIView
是一個面向?qū)ο蟮目丶啵哂袑蛹壗Y(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)部維護(hù)著三分 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)不需要與用戶進(jìn)行交互,使用核心動畫
4.當(dāng)要根據(jù)路徑做動畫時震放,使用核心動畫
5.當(dāng)做轉(zhuǎn)場動畫時宾毒,使用核心動畫(轉(zhuǎn)場類型比較多)
- 隱式動畫
CALayer
是默認(rèn)修改屬性支持隱式動畫的,在給 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默認(rèn)情況下禁止了layer動畫,但是在animation block中又重新啟用了它們疙咸。因為任何可動畫的layer屬性改變時县匠,layer都會尋找并運(yùn)行合適的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
進(jìn)行直接的圖形操作可以提供更高的性能舔琅。UIView 的交互和事件處理會涉及更多的開銷。