iOS UIView和CALayer的区别和联系

2021-09-26  本文已影响0人  搬砖的crystal

在 iOS 中,所有的 view 都是由一个底层的 layer 来驱动的。view 和它的 layer 之间有着紧密的联系,view 其实直接从 layer 对象中获取了绝大多数它所需要的数据。layer侧重于图形的显示,而view相当于layer的管理者。

1.响应事件

UIView定义

NS_CLASS_AVAILABLE_IOS(2_0) @interface UIView : UIResponder <NSCoding, UIAppearance, UIAppearanceContainer, UIDynamicItem, UITraitEnvironment, UICoordinateSpace, UIFocusItem, CALayerDelegate>

UIView这个类中它实现了CALayerDelegate,也就是说,当系统想要去绘制图形时,这时候,View会自动调用Delegate的方法去绘制你想要的图形。

CALayer定义

CA_CLASS_AVAILABLE (10.5, 2.0, 9.0, 2.0)
@interface CALayer : NSObject <NSCoding, CAMediaTiming>

从UIView和CALayer的定义可以看出UIView是继承于UIResponder,而CALayer是继承于NSObject。在iOS中,UIKit使用UIResponder作为响应对象,来响应系统传递过来的事件并进行处理。所以UIView可以响应事件,而CALyer则不能响应事件

2.初始化和Frame

一个Layer的frame是由它的anchorPoint,position,bounds,和transform共同决定的,而一个View的frame只是简单的返回Layer的frame,View的Center和Bounds只是直接返回layer对应的Position和Bounds。

3.内容管理和绘制

UIView主要是对显示内容的管理,而CALayer主要是对显示的绘制。

4.隐式动画

每个view都有一个layer,但是也有一些不依附view单独存在的layer,如CAShapelayer。它们不需要附加到view上就可以在屏幕上显示内容。

基本上你改变一个单独的layer的任何属性的时候,都会触发一个从旧的值过渡到新值的简单动画(这就是所谓的隐式动画)。然而,如果你改变的是view中layer的同一个属性,它只会从这一帧直接跳变到下一帧。尽管两种情况中都有layer,但是当layer附加在view上时,它的默认的隐式动画的layer行为就不起作用了。

在Core Animation编程指南的“How to Animate Layer-Backed Views” 中,对为什么会这样做出了一个解释:

UIView默认情况下禁止了layer动画,但是在animation block中又重新启用了它们。是因为任何可动画的layer属性改变时,layer都会寻找并运行合适的action来实行这个改变。在Core Animation的专业术语中就把这样的动画统称为动作(action,或者CAAction)。

layer 通过向它的delegate发送actionForLayer:forKey:消息来询问提供一个对应属性变化的action。delegate可以通过返回以下三者之一来进行响应:

当layer在背后支持一个view的时候,view就是它的delegate。

5.总结
上一篇下一篇

猜你喜欢

热点阅读