UIView 有個屬性 layer,能夠返回它的主 CALayer 實例:
CALayer *layer = myView.layerhtml
一個 UIView 能夠有多個 CALayer, UIView 的尺寸樣式都是由內部的 CALayer 來提供的ios
二者都有樹狀層級結構,CALayer 有 subLayers, UIView 有 subViews編程
CALayer 不能處理用戶的觸摸事件,而 UIView 能夠
UIView 繼承自 UIResponder,能夠處理用戶的觸摸事件
CALayer 直接繼承 NSObject,並無相應的處理觸摸事件的接口iview
CALayer 的座標系統比 UIView 多了一個 anchorPoint 屬性
CALayer 具備如下屬性:anchorPoint, position, bounds 和 transform 等
UIView 具備如下屬性:bounds, frame 等
UIView 是由 CoreAnimation 來實現的。它真正的繪圖部分,是由一個 CALayer 類來管理
UIView 自己更像是一個 CALayer 的管理器,訪問它的 frame,bounds 等,實際上內部都是在訪問它所包含的 CALayer 的相關屬性動畫
UIView 定義在 /System/Library/Frameworks/UIKit.framework
CALayer 定義在/System/Library/Frameworks/QuartzCore.framework
由此也可看出,UIView 側重於對顯示內容的管理,CALayer 側重於對內容的繪製
UIView 和 CALayer 是相互依賴的關係,UIView 依賴 CALayer 繪製的內容,CALayer 依賴 UIView 提供的容器來顯示繪製的內容
因此 CALayer 是基礎,沒有 CALayer,UIView 自身不會存在,然而,UIView 是 CALayer 的特殊實現,可響應觸摸事件ui
對於每個 UIView 都有一個 layer,把這個 layer 且稱做RootLayer,而不是 View 的根 Layer的叫作 非 RootLayer。咱們對UIView的屬性修改時時不會產生默認動畫,而對單獨 layer屬性直接修改會spa
在 Core Animation 編程指南的 「How to Animate Layer-Backed Views」 中,對爲何會這樣作出了一個解釋:orm
UIView 默認狀況下禁止了 layer 動畫,可是在 animation block 中又從新啓用了它們htm
是由於任何可動畫的 layer 屬性改變時,layer 都會尋找並運行合適的 'action' 來實行這個改變。在 Core Animation 的專業術語中就把這樣的動畫統稱爲動做 (action,或者 CAAction)對象
layer 經過向它的 delegate 發送 actionForLayer:forKey: 消息來詢問提供一個對應屬性變化的 action。delegate 能夠經過返回如下三者之一來進行響應:
它能夠返回一個動做對象,這種狀況下 layer 將使用這個動做
它能夠返回一個 nil, 這樣 layer 就會到其餘地方繼續尋找
它能夠返回一個 NSNull 對象,告訴 layer 這裏不須要執行一個動做,搜索也會就此中止
當 layer 在背後支持一個 view 的時候,view 就是它的 delegate
想繼續瞭解請移步 View-Layer 協做