CALayer
CALayer类在概念上和UIView类似,同样也是一些被层级关系树管理的矩形块,同样也可以包含一些内容(像图片,文本或者背景色),管理子图层的位置。它们有一些方法和属性用来做动画和变换。和UIView最大的不同是CALayer不处理用户的交互。并且CAlayer支持隐式动画。
UIView和CAlayer的关系
我重写了UIView的drawRect:
方法,并断点。
可以看到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的一个容器。
图中的contents默认可以传一个id类型的对象,但是只有你传CGImage的时候,它才能够正常显示在屏幕上。这个属性也就是我们所说的寄宿图。(即图层中包含的图)
UIImageView的产生
既然直接对 CALayer 的contents属性赋值一个CGImage便能显示图片,所以 UIImageView 就顺利成章地诞生了。实际上 UIImage 就是对 CGImage(或者 CIImage) 的一个轻量封装。
小结:
CALayer主要负责图像的绘制,而UIView其实就是CALayer的封装。UIView提供了一些iOS类似于处理触摸的具体功能,以及Core Animation底层方法的高级接口。