每日一问05——UIView与CALayer的关系

CALayer

CALayer类在概念上和UIView类似,同样也是一些被层级关系树管理的矩形块,同样也可以包含一些内容(像图片,文本或者背景色),管理子图层的位置。它们有一些方法和属性用来做动画和变换。和UIView最大的不同是CALayer不处理用户的交互。并且CAlayer支持隐式动画。

UIView和CAlayer的关系

我重写了UIView的drawRect:方法,并断点。

drawRect.png

可以看到UIView是CALayer的delegate。

CALayerDelegate

当需要被重绘-display时,CALayer会请求它的代理给他一个寄宿图来显示。它通过调用 下面这个方法做到的:

-(void)displayLayer:(CALayerCALayer *)layer;

如果未实现displayLayer方法,就会调用如下的方法:

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx;

当UIView创建了它的 宿主图层时,它就会自动地把图层的delegate设置为它自己,并提供了一个- displayLayer: 的实现,那所有的问题就都没了。

当使用寄宿了视图的图层的时候,你也不必实现 -displayLayer:和 - drawLayer:inContext: 方法来绘制你的寄宿图。通常做法是实现UIView的- drawRect: 方法,UIView就会帮你做完剩下的工作,包括在需要重绘的时候调用-display 方法

来看一张图,从图中可以感觉到UIView其实就是加载CALayer的一个容器。


每日一问05——UIView与CALayer的关系_第1张图片
image.png

图中的contents默认可以传一个id类型的对象,但是只有你传CGImage的时候,它才能够正常显示在屏幕上。这个属性也就是我们所说的寄宿图。(即图层中包含的图)

UIImageView的产生

既然直接对 CALayer 的contents属性赋值一个CGImage便能显示图片,所以 UIImageView 就顺利成章地诞生了。实际上 UIImage 就是对 CGImage(或者 CIImage) 的一个轻量封装。

小结:

CALayer主要负责图像的绘制,而UIView其实就是CALayer的封装。UIView提供了一些iOS类似于处理触摸的具体功能,以及Core Animation底层方法的高级接口。

相关文章:

离屏渲染优化
《iOS核心动画高级技巧》知识点笔记
详解CALayer 和 UIView的区别和联系

你可能感兴趣的:(每日一问05——UIView与CALayer的关系)