1. 程式人生 > 實用技巧 >iiOS 底層原理 - Uiview 與 Calyer 相關檢視知識

iiOS 底層原理 - Uiview 與 Calyer 相關檢視知識

影象顯示原理

1. UIView 和 CALayer的區別

view是layer的代理物件;view負責管理layer,layer負責渲染;

view初始化的時候預設會建立一個layer;設定view的frame和bounds等內部其實是修改layer對應屬性。

  1. 兩者最明顯的區別是View可以接受並且處理事件,而Layer不可以。
  2. 所有從UIView派生出來的UIKit類,都直接或者間接的繼承自UIResponder類,所以都會有響應事件。
  3. 而CALayer直接繼承NSObject,並沒有相應的處理事件的介面。

總結:

  1. 每個UIView內部都有一個CALayer在背後提供內容的繪製和顯示,並且UIView的尺寸樣式都由內部的Layer所提供.兩者都有樹狀層級結構,layer內部有SubLayers,View內部有SubViews,但是Layer比View多了個AnchorPoint
  2. 在View顯示的時候,UIView作為Layer的CALayerDelegate,View的顯示內容由內部的CALayer的display.
  3. CALayer是預設修改屬性支援隱士動畫的,在給UIView的Layer做動畫的時候,View作為Layer的代理,Layer通過actionForLayer: forKey: 向View請求相應的action(動畫行為)
  4. Layer內部維護者三層, presentLayer Tree(動畫樹) modeLayer Tree(模型樹) Render Tree(渲染樹), 在做iOS動畫的時候,我們修改動畫的屬性,在動畫的其實是Layer的presentLayer的屬性值,而最終展示在介面上的其實是提供View的modelLayer
  5. 兩者最明顯的區別是View可以接受並且處理事件,而Layer不可以。(CALayer沒有響應鏈,不能監聽點選,觸控等等事件.)

UIButton 的父類是什麼?UILabel 的父類又是什麼?

  • UIButton -> UIControl -> UIView -> UIResponder
  • UILabel -> UIView -> UIResponder

如何暫停一個 UIView 中正在播放的動畫?暫停後如何恢復?

記錄時間,修改 layer的速度 和 timeoffset

setNeedsDisplay 和 layoutIfNeeded 兩者是什麼關係?

  • setNeedsDisplay 是給當前的檢視做了標記。
  • layoutIfNeeded 查詢是否有標記,如果有標記及立刻重新整理。

UI繪製原理

資料推薦

如果你正在跳槽或者正準備跳槽不妨動動小手,新增一下咱們的交流群1012951431來獲取一份詳細的大廠面試資料為你的跳槽多添一份保障。