美文网首页iOS CALayer
iOS CALayer (图层的相关知识)

iOS CALayer (图层的相关知识)

作者: LiYaoPeng | 来源:发表于2017-02-05 21:42 被阅读95次

    CALayer简介

    1. 在iOS中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮、一个文本标签、一个文本输入框、一个图标等等,这些都是UIView。
    1. 其实UIView之所以能显示在屏幕上,完全是因为它内部的一个图层,在创建UIView对象时,UIView内部会自动创建一个图层(即CALayer对象),通过UIView的layer属性可以访问这个层
      @property(nonatomic,readonly,retain) CALayer *layer;
    2. 当UIView需要显示到屏幕上时,会调用drawRect:方法进行绘图,并且会将所有内容绘制在自己的图层上,绘图完毕后,系统会将图层拷贝到屏幕上,于是就完成了UIView的显示
    3. 换句话说,UIView本身不具备显示的功能,拥有显示功能的是它内部的图层。

    在iOS中CALayer的设计主要是了为了内容展示和动画操作,CALayer本身并不包含在UIKit中,它不能响应事件。由于CALayer在设计之初就考虑它的动画操作功能,CALayer很多属性在修改时都能形成动画效果,这种属性称为“隐式动画属性”。但是对于UIView的根图层而言属性的修改并不形成动画效果,因为很多情况下根图层更多的充当容器的做用,如果它的属性变动形成动画效果会直接影响子图层。另外,UIView的根图层创建工作完全由iOS负责完成,无法重新创建,但是可以往根图层中添加子图层或移除子图层。


    CALayer与UIView的区别

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

    1. UIKit使用UIResponder作为响应对象,来响应系统传递过来的事件并进行处理。UIApplication、UIViewController、UIView、和所有从UIView派生出来的UIKit类(包括UIWindow)都直接或间接地继承自UIResponder类。在 UIResponder中定义了处理各种事件和事件传递的接口。
    1. CALayer直接继承 NSObject,并没有相应的处理事件的接口。

    2.View和CALayer的Frame映射

    1. 一个 Layer 的 frame 是由它的 anchorPoint,position,bounds,和 transform 共同决定的,而一个 View 的 frame 只是简单的返回 Layer的 frame,同样 View 的 center和 bounds 也是返回 Layer 的一些属性。(一会儿解析属性的时候会再做比较)
    1. 对于frame的理解请看这里
    2. UIView主要是对显示内容的管理而 CALayer 主要侧重显示内容的绘制。
    3. 在做 iOS 动画的时候,修改非 RootLayer的属性(譬如位置、背景色等)会默认产生隐式动画,而修改UIView则不会。

    CALayer的基本属性

    CALayer的属性.jpg

    属性解释:

    1. position

    layer在父视图上的相对坐标:(计算公式)

    position.x = frame.origin.x + anchorPoint.x * bounds.size.width;  
    position.y = frame.origin.y + anchorPoint.y * bounds.size.height;
    

    2. anchorPoint (锚点)

    锚点指定的是自身(本Layer)哪个位置出现在父视图的position点
    取值范围为[0,1];
    可以参考这里更好理解anchorPoint

    3. CornerRadius(圆角半径)

    可以设置四周的圆角,配合maskToBounds = YES;裁切成圆矩形或圆
    但是一般裁切圆角我们不这么用,因为特别耗费性能;
    关于切圆角更详细的叙述,请查看这篇文章:《Quartz 2D 手势 截图 动画小demo》

    4.mask

    1. 其实就是一个遮罩,一般来说,给UIView或者CALayer做Mask只需要用一个CAShapeLayer来充当CALayer或者UIView.layer的mask属性就好了(当然你也可以用别的炫酷的CALayer子类来当mask,比如说CATextLayer一会儿会分别讲到)。
    1. mask作为CALayer的属性,它本身也是一个CALayer,但是作为mask,最重要的是它的轮廓形状,Color是无关紧要的

    5.transfrom

    1. transform : 是结合 anchorPoint(锚点)的位置来对图层和图层上的子图层进行变化。
    1. sublayerTransform:是结合anchorPoint(锚点)的位置来对图层的子图层进行变化,不包括本身。
    2. CATransform3DIdentity 是单位矩阵,该矩阵没有缩放,旋转,歪斜,透视。该矩阵应用到图层上,就是设置默认值。CATransform3DIdentity查看详细笔记请看这里

    CALayer的一些特殊的子类

    CAShapeLayer

    CAShapeLayer是一个通过矢量图形而不是bitmap来绘制的图层子类。你指定诸如颜色和线宽等属性,用CGPath来定义想要绘制的图形,最后CAShapeLayer就自动渲染出来了。当然,你也可以用Core Graphics直接向原始的CALyer的内容中绘制一个路径,相比直下,使用CAShapeLayer有以下一些优点:

    1. 渲染快速。CAShapeLayer使用了硬件加速,绘制同一图形会比用Core Graphics快很多。
    2. 高效使用内存。一个CAShapeLayer不需要像普通CALayer一样创建一个寄宿图形,所以无论有多大,都不会占用太多的内存。
      不会被图层边界剪裁掉。一个CAShapeLayer可以在边界之外绘制。你的图层路径不会像在使用Core Graphics的普通CALayer一样被剪裁掉。
    3. 不会出现像素化。当你给CAShapeLayer做3D变换时,它不像一个有寄宿图的普通图层一样变得像素化。
      详细讲解CAShapeLayer

    其他子类知识请点击这里

    相关文章

      网友评论

        本文标题:iOS CALayer (图层的相关知识)

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