CALayer和UIView


前言


本次分享將從以下方面進行展開:

  1. 曾被面試官問倒過的問題:層與視圖的關系
  2. CALayer類介紹及層與視圖的關系
  3. CAShapeLayer類介紹
  4. UIBezierPath貝塞爾曲線講解
  5. CoreAnimation之動畫子類介紹
  6. CATransitionAnimation類實現各種過濾動畫

關於Core AnimationiOS系統中的關系圖如下:


image

可以看出,Core Animation是相對上層的封裝,介於UIKitCore GraphicsOpenGL/OpenGL ES之間。最底下還有一個Graphics Hardware,就是硬件了!!!

層與視圖的關系


我們先看看WindowLayer之間的關系:

image

 

這個圖告訴我們,層是基於繪畫模型實現的,層並不會在我們的app中做什么事,實際上是層只是捕獲app所提供的內容,並緩存成bitmap,當任何與層關聯的屬性值發生變化時,Core Animation就會將新的bitmap傳給繪圖硬件,並根據新的位圖更新顯示。

UIViewiOS系統中界面元素的基礎,所有的界面元素都是繼承自UIView。它本身完全是由CoreAnimation來實現的。它真正的繪圖部分,是由一個CALayer類來管理。UIView本身更像是一個CALayer的管理器,訪問它的跟繪圖和跟坐標有關的屬性,例如framebounds等,實際上內部都是在訪問它所包含的CALayer的相關屬性。

提示:layer-based drawing不同於view-based drawing,后者的性能消耗是很高的,它是在主線程上直接通過CPU完成的,而且通常是在-drawRect:中繪制動畫。

UIView與CALayer的聯系

我們看看UIViewlayer之間的關系圖:

image

我們可以看到,一個UIView默認就包含一個layer屬性,而layer是可以包含sublayer的,因此形成了圖層樹。從此圖可以看出這兩者的關系:視圖包含一個layer屬性且這個layer屬性可以包含很多個sublayer

有人說UIView就像一個畫板,而layer就像畫布,一個畫板上可以有很多塊畫布,但是畫布不能有畫板。

UIView與CALayer的主要區別

  1. UIView是可以響應事件的,但是CALayer不能響應事件
  2. UIView主要負責管理內容,而CALayer主要負責渲染和呈現。如果沒有CALayer,我們是看不到內容的。
  3. CALayer維護着三個layer tree,分別是presentLayer TreemodeLayer TreeRender Tree,在做動畫的時候,我們修改動畫的屬性,其實是修改presentLayer的屬性值,而最終展示在界面上的其實是提供UIViewmodelLayer

官方說明了UIViewCALayer的聯系:

Layers are not a replacement for your app’s views—that is, you cannot create a visual interface based solely on layer objects. Layers provide infrastructure for your views. Specifically, layers make it easier and more efficient to draw and animate the contents of views and maintain high frame rates while doing so. However, there are many things that layers do not do. Layers do not handle events, draw content, participate in the responder chain, or do many other things. For this reason, every app must still have one or more views to handle those kinds of interactions.

說說CALayer


我們首先得明確LayeriOS系統上的坐標系起點是在左上角的,而在OS X系統上是左下角的:

 

image

筆者對Layer相關的屬性和方法畫了這么一張圖:

image

看看官方關於Layer Tree的說明:

image

 

Core Animation介紹


我們在開發中常見的動畫:

image

筆者將Core Animation的關系圖及相關屬性、方法說明都通過該圖來表達:

image

如果我們要改變動畫的行為,我們可以實現CAAction協議的方法,像這樣:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM