view和layer知識點整理

語言: CN / TW / HK

view和layer的區別\ view和layer最主要的區別是view可以處理事件,layer不可以\ 每一個view都有一個layer屬性,該屬性的型別是CALayer,它是管理著view介面的繪製,而這個view是layer的delegate。\ \ view依賴於layer來繪製介面,當然很多的屬性view都是直接返回layer的,比如frame是直接返回的layer的frame,而layer的frame是由它的anchorPoint,position,bounds,和 transform共同決定的\ \ 總接來說就是如下幾點:\ \ ●不同繼承關係:CALayer 繼承自 NSObject,UIView 由於要負責互動事件,所以繼承自 UIResponder。\ ●每個 UIView 內部都有一個 CALayer 在背後提供內容的繪製和顯示,並且 UIView 的尺寸樣式都由內部的 Layer 所提供。兩者都有樹狀層級結構,layer 內部有 SubLayers,View 內部有 SubViews.但是 Layer 比 View 多了個AnchorPoint\ ●在 View顯示的時候,UIView 做為 Layer 的 CALayerDelegate,View 的顯示內容由內部的 CALayer 的 display\ ●CALayer 是預設修改屬性支援隱式動畫的,在給 UIView 的 Layer 做動畫的時候,View 作為 Layer 的代理,Layer 通過 actionForLayer:forKey:向 View請求相應的 action(動畫行為)\ ●layer 內部維護著三分 layer tree,分別是 presentLayer Tree(動畫樹),modeLayer Tree(模型樹), Render Tree (渲染樹),在做 iOS動畫的時候,我們修改動畫的屬性,在動畫的其實是 Layer 的 presentLayer的屬性值,而最終展示在介面上的其實是提供 View的modelLayer\ ●兩者最明顯的區別是 View可以接受並處理事件,而 Layer 不可以\ ●layer有很多種,比如 CAShapeLayer、CAScrollLayer、AVCaptureVideoPreviewLayer ... 這些都繼承自CALayer,CALayer繼承NSObject\ ●CALayer 是 UIView 的屬性之一,負責渲染和動畫,提供可視內容的呈現。\ \ 為什麼要將 CALayer 獨立出來,直接使用 UIView 統一管理不行嗎?為什麼不用一個統一的物件來處理所有事情呢?\ 單一原則(職責分離,拆分功能,方便程式碼的複用)View 負責互動 時間傳遞。Layer 負責繪製 通過 Core Animation 框架來負責可視內容的呈現,這樣在 iOS 和 OS X 上都可以使用 Core Animation 進行渲染。與此同時,兩個系統還可以根據互動規則的不同來進一步封裝統一的控制元件,比如 iOS 有 UIKit 和 UIView,OS X 則是AppKit 和 NSView。\ \ 有了這兩個最關鍵的根本關係,那麼下面這些經常出現在面試答案裡的顯性的異同就很好解釋了。舉幾個例子:\ ●相同的層級結構:我們對 UIView 的層級結構非常熟悉,由於每個 UIView 都對應 CALayer 負責頁面的繪製,所以 CALayer 也具有相應的層級結構。\ ●部分效果的設定:因為 UIView 只對 CALayer 的部分功能進行了封裝,而另一部分如圓角、陰影、邊框等特效都需要通過呼叫 layer 屬性來設定。\ ●是否響應點選事件:CALayer 不負責點選事件,所以不響應點選事件,而 UIView 會響應。\ ●不同繼承關係:CALayer 繼承自 NSObject,UIView 由於要負責互動事件,所以繼承自 UIResponder。\ 當然還剩最後一個問題,\ 這樣設計的主要原因就是為了職責分離,拆分功能,方便程式碼的複用。