Core Animation 笔记

Core Animation把view内容存成bitmap传给GPU,通过尽量使用缓存的bitmap,并修改传入GPU的bounds/position/transform/alpha等属性来画图。这就比view的drawRect:高效得多,drawRect:要占用CPU的主线程来画图。

animation状态由layer trees表示,layer tree与view tree层次结构相同:

  • model layer tree:存着animation的target values
  • presentation tree: 存着animation的in-flight values
  • render tree: 管着实际animation,Core Animation私有

presentationLayer当图层第一次在屏幕显示时创建,在此之前是nil

要修改view的底层layer,可重载+ (Class)layerClass;

UIView封装了CALayer,添加了布局和事件处理功能,但有些CALayer的功能没有暴露出来:

  • 阴影、圆角、带颜色的边框
  • 3D变换
  • 非矩形区域
  • 图层蒙版
  • 多级非线性动画

给layer.contents赋值:layer.contents = (__bridge id)image.CGImage;

给layer.mask设置一个mask图层,对应mask图层opacity == 1的部分会被保留下来,其他部分根据opacity变得透明

view的masksToBounds会把超出边界的阴影切掉。为有阴影,可以在外面套一层view,内层view使用mask,外层view使用阴影。

view.transform是CGAffineTransform类型(对应layer.affineTransform),在二维平面的旋转、缩放、平移、切变都是仿射变换(即在变换后平行线仍平行)

通过设置layer.sublayerTransform(CATransform3D类型)的m34元素为-1.0/d可对子图层应用透视效果。d代表想象中视角相机和屏幕的距离,以像素为单位,通常500~1000就好。这样,sublayer.transform(CATransform3D类型)就只要CATransform3DMakeRotation即可,不用再设置m34透视。

在animation时设置transform.rotationtransform.scale等虚拟属性,Core Animation会自动根据CAValueFunction计算的值来更新transform属性

duration是动画一次迭代的时间;若配合迭代次数repeatCount,则动画总时间是duration * repeatCount;若配合动画总时间repeatDuration,则迭代次数是repeatDuration / duration

即使你不显式地用[CATransaction begin]开始一次事务,任何一次runloop循环中属性的改变都会被集中到一个新的CATransaction,然后做一次默认0.25秒的动画。

按Home键退出app时,系统会在layer上调removeAllAnimations

参考