学习CoreAnimation – CALayer

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对于使用者所做的差异化子类,可以为我们日常使用提供更加明确的选择,图层的学习也不是一蹴而就的,需要多花时间琢磨每一个巧妙地组合,在熟悉用法之后就可以事半功半。

加油,每一个潜心学习到深夜的人一起进步。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享