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)方法進(jìn)行繪制。這種設(shè)計使得開發(fā)者可以在 UIView 的上下文中定制內(nèi)容繪制邏輯南用,同時利用 CALayer 的高效渲染能力膀钠。
2 框架和繼承
  • 兩者所屬的框架不同:UIView屬于UIKit框架,而CALayerQuartzCore框架下
  • 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/get UIView 的這些屬性時,實際上是在更改或者獲取 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 繪制圖形,或通過 contentsGravitymask 等屬性控制內(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é)合 CABasicAnimationCAKeyframeAnimationCATransaction 等動畫類朵诫,可以輕松實現(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 的交互和事件處理會涉及更多的開銷。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末洲劣,一起剝皮案震驚了整個濱河市备蚓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌囱稽,老刑警劉巖郊尝,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異战惊,居然都是意外死亡流昏,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來况凉,“玉大人谚鄙,你說我怎么就攤上這事〉笕蓿” “怎么了闷营?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長知市。 經(jīng)常有香客問我傻盟,道長,這世上最難降的妖魔是什么初狰? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任莫杈,我火速辦了婚禮,結(jié)果婚禮上奢入,老公的妹妹穿的比我還像新娘筝闹。我一直安慰自己,他們只是感情好腥光,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布关顷。 她就那樣靜靜地躺著寥殖,像睡著了一般嗦嗡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上汛闸,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天捉片,我揣著相機(jī)與錄音平痰,去河邊找鬼。 笑死伍纫,一個胖子當(dāng)著我的面吹牛宗雇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播莹规,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼赔蒲,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了良漱?” 一聲冷哼從身側(cè)響起舞虱,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎母市,沒想到半個月后矾兜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡患久,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年椅寺,在試婚紗的時候發(fā)現(xiàn)自己被綠了舶沿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡配并,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出高镐,到底是詐尸還是另有隱情溉旋,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布嫉髓,位于F島的核電站观腊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏算行。R本人自食惡果不足惜梧油,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望州邢。 院中可真熱鬧儡陨,春花似錦、人聲如沸量淌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽呀枢。三九已至胚股,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間裙秋,已是汗流浹背琅拌。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留摘刑,地道東北人进宝。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像泣侮,于是被迫代替她去往敵國和親即彪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354