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.rotation
、transform.scale
等虚拟属性,Core Animation会自动根据CAValueFunction
计算的值来更新transform
属性
duration
是动画一次迭代的时间;若配合迭代次数repeatCount
,则动画总时间是duration * repeatCount
;若配合动画总时间repeatDuration
,则迭代次数是repeatDuration / duration
即使你不显式地用[CATransaction begin]
开始一次事务,任何一次runloop循环中属性的改变都会被集中到一个新的CATransaction
,然后做一次默认0.25秒的动画。
按Home键退出app时,系统会在layer上调removeAllAnimations