iOS開發日記53-CALayer和UIView

今天博主有一個內容繪製的需求,遇到了一些困難點,在此和你們分享,但願可以共同進步.動畫

今天和你們分享一下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; }
相關文章
相關標籤/搜索