iiOS 底層原理 - Uiview 與 Calyer 相關檢視知識
阿新 • • 發佈:2020-10-22
影象顯示原理
1. UIView 和 CALayer的區別
view是layer的代理物件;view負責管理layer,layer負責渲染;
view初始化的時候預設會建立一個layer;設定view的frame和bounds等內部其實是修改layer對應屬性。
- 兩者最明顯的區別是View可以接受並且處理事件,而Layer不可以。
- 所有從UIView派生出來的UIKit類,都直接或者間接的繼承自UIResponder類,所以都會有響應事件。
- 而CALayer直接繼承NSObject,並沒有相應的處理事件的介面。
總結:
- 每個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內部維護者三層, presentLayer Tree(動畫樹) modeLayer Tree(模型樹) Render Tree(渲染樹), 在做iOS動畫的時候,我們修改動畫的屬性,在動畫的其實是Layer的presentLayer的屬性值,而最終展示在介面上的其實是提供View的modelLayer
- 兩者最明顯的區別是View可以接受並且處理事件,而Layer不可以。(CALayer沒有響應鏈,不能監聽點選,觸控等等事件.)
UIButton 的父類是什麼?UILabel 的父類又是什麼?
- UIButton -> UIControl -> UIView -> UIResponder
- UILabel -> UIView -> UIResponder
如何暫停一個 UIView 中正在播放的動畫?暫停後如何恢復?
記錄時間,修改 layer的速度 和 timeoffset
setNeedsDisplay 和 layoutIfNeeded 兩者是什麼關係?
- setNeedsDisplay 是給當前的檢視做了標記。
- layoutIfNeeded 查詢是否有標記,如果有標記及立刻重新整理。
UI繪製原理
資料推薦
如果你正在跳槽或者正準備跳槽不妨動動小手,新增一下咱們的交流群1012951431來獲取一份詳細的大廠面試資料為你的跳槽多添一份保障。