jlsdflfsfjf
總接來說就是如下幾點:
- 1.每一個UIView都有一個CALayer實例的圖層屬性,視圖的職責(zé)就是創(chuàng)建和管理這些圖層,其實真正顯示和用來做動畫的是背后關(guān)聯(lián)的圖層,UIView僅僅是對它的一個封裝,提供了一些類似于處理用戶交互的具體功能和接口。其實,UIView更像是一個CALayer的管理器,訪問它的有關(guān)繪圖跟坐標(biāo)的屬性,其實底層都是在訪問CALayer的屬性。
- 每個 UIView 內(nèi)部都有一個 CALayer 在背后提供內(nèi)容的繪制和顯示,并且 UIView 的尺寸樣式都由內(nèi)部的 Layer 所提供,相同的是兩者都有樹狀層級結(jié)構(gòu),layer內(nèi)部youSublayers,View內(nèi)部有Subviews,但是,Layer比View多個AnchorPoint。
- layer 內(nèi)部維持著三份layer tree,分別是 presentLayer Tree(動畫樹),modeLayer Tree(模型樹), Render Tree (渲染樹),在做 iOS動畫的時候,我們修改動畫的屬性,在動畫的其實是 Layer 的 presentLayer的屬性值,而最終展示在界面上的其實是提供 View的modelLayer
- 兩者最明顯的區(qū)別是 View可以接受并處理事件,而 Layer 不可以
- 在View即將顯示的時候,UIView會自動的把圖層的delegate設(shè)置為自己,并提供了一個displayLayer:的實現(xiàn),
- CALayer是默認(rèn)修改屬性支持隱式動畫。
問:為什么iOS要基于UIView和CALayer提供兩個平行的層級結(jié)構(gòu)呢?
- 答:原因就是做到職責(zé)分離,避免很多重復(fù)代碼。在iOS和MacOS兩個平臺上,事件與用戶交互有很多的不同,基于多點觸控的用戶界面和鼠標(biāo)鍵盤有著本質(zhì)的區(qū)別,這就是iOS有UIKit和UIView,而Mac OS有AppKit和NSView的原因。創(chuàng)建兩個層次結(jié)構(gòu)就能夠在iOS與Mac OS 之間共享代碼,從而使得開發(fā)更加便捷。