美文网首页
iOS 知识整理 -- CALayer

iOS 知识整理 -- CALayer

作者: 不不不紧张 | 来源:发表于2020-02-10 13:45 被阅读0次

    把看到的东西写出来,可以加深印象

    1 与UIView的关系

    异同:

    CALayer与UIView都是被层级关系树管理的矩形块,都可以包含一些内容,管理子视图的位置,主要区别体现在CALayer不能响应事件

    每个UIView都有一个CALayer的属性,UIView是对CALayer的一个封装,对图形设置提供了一些简单的接口,同时可以处理点击事件,这种设计主要目的是为了实现职责分离,CALayer只负责展示图像,响应事件由UIView负责,符合程序设计六大原则中的单一职责原则

    CALayer中没有被UIView封装的功能:

        1.阴影,圆角,带颜色的边框 3D变换
        2.非矩形范围
        3.透明遮罩
        4.多级非线性动画
    

    2 CALayer的属性

    contents属性

    属性名:contents

    类型:id,必须用CGImageRef赋值,类型为id是macOS的历史问题造成的,这个值对CGImage和NSImage都起作用,当我们用UIimage的CGImage属性为其赋值时会报错,原因是Core Foundation对象与cocoa对象并不类型兼容,需要通过bridged关键字转换:

    image

    效果:


    image.png

    contentsGravity属性

    属性名:contentsGravity

    作用:决定内容在图层的边界中怎么对齐,与UIView中的contentMode对应

    类型:NSString。 可选常量有以下几个

    • kCAGravityCenter 原尺寸显示居中


      image.png
    • kCAGravityTop 原尺寸显示底部与layer对齐

      image.png
    • kCAGravityBottom 原尺寸显示顶部与layer对齐


      image.png
    • kCAGravityLeft 原尺寸显示左侧与layer对齐


      image.png
    • kCAGravityRight 原尺寸显示右侧与layer对齐


      image.png
    • kCAGravityTopLeft


      image.png
    • kCAGravityTopRight


      image.png
    • kCAGravityBottomLeft


      image.png
    • kCAGravityBottomRight


      image.png
      • kCAGravityResize 拉伸使大小与layer一致


        image.png
    • kCAGravityResizeAspect 等比例拉伸,在不超出layer范围的前提下以最大尺寸显示


      image.png
    • kCAGravityResizeAspectFill 等比例拉伸,允许超出layer范围显示,宽度和高度中有一项与layer宽高中更大的一项保持一致


      image.png

    maskToBounds属性

    属性名:masksToBounds

    类型:BOOL。与UIView的clipsToBounds对应,作用相同

    contentsRect属性

    属性名:contentsRect

    类型:CGRect。值不是point,而是相对于原尺寸的比例,在0 ~ 1之间

    作用:允许我们只展示content的一部分内容

    效果:添加代码


    截屏2020-02-12下午12.16.08.png image.png

    效果受layer的contentsGravity属性影响,当我们设置:


    截屏2020-02-12下午12.18.18.png

    展示效果变成了:


    image.png

    contentsCenter属性

    属性名:contentsCenter

    类型:CGRect。取值范围在0 ~1之间

    作用:用这个属性定义一个边框,边框里的内容均匀拉伸,边框外侧四个角正方形范围内不进行拉伸,其他部分根据情况水平或者竖直拉伸,只有在content对内容进行拉伸使才能看到效果

    效果:添加代码


    截屏2020-02-12下午5.25.58.png

    展示效果变成了:


    image.png

    mask属性

    属性名:mask

    类型:CALayer

    作用:通过一个CALayer控制当前layer内容的可视区域,mask也是一个CALayer,但是通常只需要关心mask内容中实心区域的轮廓,当前layer只有在mask的content内容中实心范围内的内容是可见的

    效果:找了一张中国地图的png图片,除了地图外其他区域是透明的,我们用这个地图图片为mask的content赋值


    testImage2 截屏2020-02-12下午6.07.20.png

    展示效果:


    image.png

    拉伸过滤器属性

    属性名:minificationFilter(缩小过滤器),magnificationFilter(放大过滤器)

    类型:NSString 可选:

    • kCAFilterLinear (默认)
    • kCAFilterNearest (速度快但是像素化严重)
    • kCAFilterTrilinear (三线性滤波算法,与kCAFilterLinear效果相近)

    效果:默认效果:


    image.png

    添加代码:


    截屏2020-02-17上午9.53.39.png image.png

    图片上传中被压缩依然能看出设置kCAFilterNearest后像素化更严重,实际情况像素化现象更加明显

    相关文章

      网友评论

          本文标题:iOS 知识整理 -- CALayer

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