iOS 知识整理 -- CALayer

2020-02-10  本文已影响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。 可选常量有以下几个

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 可选:

效果:默认效果:


image.png

添加代码:


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

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

上一篇下一篇

猜你喜欢

热点阅读