把看到的东西写出来,可以加深印象
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后像素化更严重,实际情况像素化现象更加明显
网友评论