美文网首页
每日一问05——UIView与CALayer的关系

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

作者: 巫师学徒 | 来源:发表于2017-08-30 17:24 被阅读52次

    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的一个容器。


    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的关系

          本文链接:https://www.haomeiwen.com/subject/dwxxjxtx.html