今天博主有一個內容繪製的需求,遇到了一些困難點,在此和你們分享,但願可以共同進步.動畫
今天和你們分享一下CALayer和UIView的區別:spa
1.UIKit使用UIResponder做爲響應對象,來響應系統傳遞過來的事件並進行處理。UIApplication、UIViewController、UIView、和全部從UIView派生出來的UIKit類(包括UIWindow)都直接或間接地繼承自UIResponder類.代理
在 UIResponder中定義了處理各類事件和事件傳遞的接口, 而 CALayer直接繼承 NSObject,並無相應的處理事件的接口,二者最明顯的區別是 View能夠接受並處理事件,而 Layer 不能夠orm
2.一個 Layer 的 frame 是由它的 anchorPoint,position,bounds,和 transform 共同決定的,而一個 View 的 frame 只是簡單的返回 Layer的 frame,一樣 View 的 center和 bounds 也是返回 Layer 的一些屬性.對象
在 View顯示的時候,UIView 作爲 Layer 的 CALayerDelegate,View 的顯示內容由內部的 CALayer 的 繪製繼承
3.每一個 UIView 內部都有一個 CALayer 在背後提供內容的繪製和顯示,而且 UIView 的尺寸樣式都由內部的 Layer 所提供。二者都有樹狀層級結構,layer 內部有 SubLayers,View 內部有 SubViews.可是 Layer 比 View 多了個AnchorPoint接口
layer 內部維護着三分 layer tree,分別是 presentLayer Tree(動畫樹),modeLayer Tree(模型樹), Render Tree (渲染樹),在作 iOS動畫的時候,咱們修改動畫的屬性,在動畫的實際上是 Layer 的 presentLayer的屬性值,而最終展現在界面上的實際上是提供 View的modelLayer事件
4.CALayer 是默認修改屬性支持隱式動畫的,在給 UIView 的 Layer 作動畫的時候,View 做爲 Layer 的代理,Layer 經過 actionForLayer:forKey:向 View請求相應的 action(動畫行爲),對於每個 UIView 都有一個 layer,把這個 layer 且稱做RootLayer,而不是 View 的根 Layer的叫作 非 RootLayer。咱們對UIView的屬性修改時時不會產生默認動畫,而對單獨 layer屬性直接修改會,這個默認動畫的時間缺省值是0.25sit
5.再和你們分享一下UIView轉換UIImage的一個小技巧io
+ (UIImage*) imageWithUIView:(UIView*) view{
UIGraphicsBeginImageContext(view.bounds.size); CGContextRef currnetContext = UIGraphicsGetCurrentContext(); [view.layer renderInContext:currnetContext]; UIImage* image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return image; }