UIView与CALayer

CALayer与UIView

1、 UIView可以响应事件,Layer不可以

UIKit使用UIResponse作为响应对象,来响应系统传递过来的事件并进行处理。UIApplication、UIViewController、UIView、和所有从UIView派生出来的UIKit类(包括UIWindow)都直接或间接地继承自UIResponder类。

在UIResponse中定义了处理各种事件和事件传递接口,而CALayer直接继承NSObject,并没有相应的处理事件的接口;

2.View和CALayer的Frame映射及View如何创建CALayer.

一个 Layer 的 frame 是由它的anchorPoint,position,bounds,和 transform 共同决定的,而一个 View 的 frame 只是简单的返回 Layer的 frame,同样View 的 center和 bounds 也是返回 Layer 的一些属性。

3.UIView主要是对显示内容的管理而 CALayer 主要侧重显示内容的绘制。UIView 是 CALayer 的CALayerDelegate。

4.在做 iOS 动画的时候,修改非 RootLayer的属性(譬如位置、背景色等)会默认产生隐式动画,而修改UIView则不会。

对于每一个 UIView 都有一个 layer,把这个 layer 且称作RootLayer,而不是 View 的根 Layer的叫做 非RootLayer。我们对UIView的属性修改时时不会产生默认动画,而对单独 layer属性直接修改会,这个默认动画的时间缺省值是0.25s.

总结

  • 每个 UIView 内部都有一个 CALayer 在背后提供内容的绘制和显示,并且 UIView 的尺寸样式都由内部的 Layer 所提供。两者都有树状层级结构,layer 内部有 SubLayers,View 内部有 SubViews.但是 Layer 比 View 多了个AnchorPoint
  • 在 View显示的时候,UIView 做为 Layer 的 CALayerDelegate,View 的显示内容由内部的 CALayer 的 display
  • CALayer 是默认修改属性支持隐式动画的,在给 UIView 的 Layer 做动画的时候,View 作为 Layer 的代理,Layer 通过 actionForLayer:forKey:向 View请求相应的 action(动画行为)

UIView 拥有 CALayer,CALayer 的 Delegate 是UIView;

最大的区别是图层(CALayer)不会直接渲染到屏幕上。

UIView是iOS系统中界面元素的基础,所有界面元素都是继承自它。它本身完全是由CoreAnimation来实现。

真正的绘图部分,是由一个CALayer类来管理。

一个UIView上可以由n个CALayer,每个CALayer显示一种东西,增强UIView的展现能力。

UIViewCALayer关系总结

UIView和CALayer二者缺一不可,没有CALayer,UIView看不到内容;没有UIView,CALayer像什么内容也没有一样。

1、UIView继承UIResponder,而CALayer继承NSObject。所以UIView可以响应事件,CALayerb不能。

2、UIView有layer属性,有layerClass方法,而CALayer类中没有UIView相关属性和方法。UIView主要负责管理内容,而CALayer主要负责渲染、呈现、隐式动画。

1)获取UIView的CALayer属性,从UIView->CALayer。通过重写layerClass方法,change其中CALayer类型。

2)获取UIView的frame、bounds等属性,其实获取的对应CALayer的属性,设置原理也一样。(隐式动画指的是,由于非rootLayer的frame、bounds等属性值改变时,所产生的界面上的渐变过程)

3、UIView和CALayer都采用树结构,superView/superLayer、subView/subLayer、addSubView:/addSubLayer:等。

4、CALayer维护着三份layertree,分别是presentLayer tree、modelLayer tree、rendertree,在做动画的时候,我们修改动画的属性,其实是修改presentLayer的属性值,而最终展示在界面上的其实是提供UIView的modelLayer。

你可能感兴趣的:(UIView与CALayer)