UIView与CALayer的关系
UIView负责响应事件;CALayer负责处理图层,绘制UI
有很多需要交互的工作要View来完成,而layer属性的意义也很明确,就在于管理图层,它支持三维坐标系绘制,像是通过锚点和矩阵运算,来决定动画绘制的状态。View仅仅是多了一层封装,提供了事件响应和Core Animation的底层方法入口。每个View都有对应的layer图层来绘制我们需要的内容,layer中也支持嵌套。
CALyer
初学layer
在我们日常使用CoreAnimation,大部分的动画都可以通过Layer实现,而熟练用好layer层,可以帮助我们处理更复杂的层次结构以及变换效果。
CALayer和UIView是两个平行的层级关系,目的是做到职责分离,同样的也能避免产生重复代码,这样可以在iOS和macOS两个平台分别处理手势和鼠标的交互问题,作用包括
- 透明层
- 阴影
- 圆角
- 边框颜色渲染
圆角
cornerRadius
复制代码
阴影
shadowOffset偏移量
shadowOpacity透明度
shadowRadius范围宽度
shadowColor颜色
复制代码
边框
borderWidth宽度
borderColor颜色
复制代码
颜色、透明度
opacity透明度
backgroundColor表示cgcolor对象赋值
复制代码
图像
contents表示cgimage对象赋值
contentsGravity图片内容适应图层
masksToBounds超出图层外部的部分裁切,为false不裁切
contentsScale图像比列
contentsRect裁切内容(可用于裁切后合并)
复制代码
初识锚点
anchorPoint是锚点,它决定图层的绘制位置,同时也决定动画行进间的参照点。
关于锚点我们需要知道几个概念:
第一,layer的锚点和position位置始终重合,上面我们说到了决定frame的位置的条件,layer的大小和位置是position和bounds决定的。
第二,锚点决定动画行进的参照物(可以把它看作是一个圆规的中心,layer沿着中心点进行位移),换句话说,anchorPoint直接影响了动画始终动作的参照点
第三,锚点的计量单位是一个参照比例的概念,表示所占图层宽高的等分比例
frame、bounds、anchorPoint三者的关系
1.在UIView中我们有frame、bounds、center属性,在CALayer中有与之对应的frame、bounds、position,而关于他们的说法中,frame因为存在父视图上层,表示外部坐标的位置;bounds表示本身内部坐标位置,center或anchorpoint表示中心点位置
2.对于frame来说,layer改变view就会改变,view改变layer就会改变;因为frame是一个虚拟的属性,它是根据bounds,position,transform计算而来
3.frame表示图层的虚拟矩形区域,bounds坐标系统从左上角0,0开始的坐标范围;当变旋转换之后,frame的矩形区域会随之变换,bounds则会保持不变
4.anchorPoint是相对于superLayer上layer的一个点,它是一个宽高比的值(从中间0.5,0.5开始;范围0-1)
高级专有图层
可以根据CALayer的不同子类,自定义一个layer,用于实现特定功能
CAShapeLayer
使用CGPath构造形状,最后渲染
使用方法:CAShapeLayer的path配合UIBezierPath。
复制代码
CATextLayer
绘制文本内容标签,包括UILabel在内的和一些高级特性
CATransformLayer
适用于3D层多层层次结构特性
CAGradientLayer
图层的颜色平滑渐变
CAReplicatorLayer
用于拷贝图层后的差异变换,也可以用于镜面倒影效果
CAScrollLayer
图层上的滑动
CATiledLayer
为了处理内存占用和CPU绘制效率,拆分大图,依次加载小图
CAEmitterLayer
显示图层粒子效果
CAEAGLLayer(ios12已弃用)
用于高性能图形绘制
AVPlayerLayer
用于播放器对象内容的绘制
总结
CALayer对于使用者所做的差异化子类,可以为我们日常使用提供更加明确的选择,图层的学习也不是一蹴而就的,需要多花时间琢磨每一个巧妙地组合,在熟悉用法之后就可以事半功半。
加油,每一个潜心学习到深夜的人一起进步。