1,首先UIView可以響應(yīng)事件,Layer不可以。
>UIKit使用UIResponder作為響應(yīng)對象,來響應(yīng)系統(tǒng)傳遞過來的事件并進行處理。UIApplication、UIViewController、UIView、和所有從UIView派生出來的UIKit類(包括UIWindow)都直接或間接地繼承自UIResponder類.
在 UIResponder中定義了處理各種事件和事件傳遞的接口, 而 CALayer直接繼承 NSObject,并沒有相應(yīng)的處理事件的接口,兩者最明顯的區(qū)別是 View可以接受并處理事件,而 Layer 不可以
2,View和CALayer的Frame映射及View如何創(chuàng)建CALayer?
>一個 Layer 的 frame 是由它的(maodian:anchorPoint),(位置:position),(大小:bounds),和 (形變:transform) 共同決定的,而一個 View 的 frame 只是簡單的返回 Layer的 frame,同樣 View 的 center和 bounds 也是返回 Layer 的一些屬性.在 View顯示的時候,UIView 做為 Layer 的 CALayerDelegate,View 的顯示內(nèi)容由內(nèi)部的 CALayer 的 繪制
3,UIView主要是對顯示內(nèi)容的管理而CALayer主要側(cè)重顯示內(nèi)容的繪制
>每個 UIView 內(nèi)部都有一個 CALayer 在背后提供內(nèi)容的繪制和顯示,并且 UIView 的尺寸樣式都由內(nèi)部的 Layer 所提供。兩者都有樹狀層級結(jié)構(gòu),layer 內(nèi)部有 SubLayers,View 內(nèi)部有 SubViews.但是 Layer 比 View 多了個AnchorPoint
layer 內(nèi)部維護著三分 layer tree,分別是 presentLayer Tree(動畫樹),modeLayer Tree(模型樹), Render Tree (渲染樹),在做 iOS動畫的時候,我們修改動畫的屬性,在動畫的其實是 Layer 的 presentLayer的屬性值,而最終展示在界面上的其實是提供 View的modelLayer
4,在做IOS動畫的時候,修改非RootLayer的屬性(譬如:位置,背景色等)會默認(rèn)產(chǎn)生隱式動畫,而修改UIView則不會)
>CALayer 是默認(rèn)修改屬性支持隱式動畫的,在給 UIView 的 Layer 做動畫的時候,View 作為 Layer 的代理,Layer 通過 actionForLayer:forKey:向 View請求相應(yīng)的 action(動畫行為),對于每一個 UIView 都有一個 layer,把這個 layer 且稱作RootLayer,而不是 View 的根 Layer的叫做 非 RootLayer。我們對UIView的屬性修改時時不會產(chǎn)生默認(rèn)動畫,而對單獨 layer屬性直接修改會,這個默認(rèn)動畫的時間缺省值是0.25s