理解Core Animation
三种树状结构
-
图层树
:模型对象,携带动画结束后CALayer
对象属性的目标值
。修改图层对象
的属性值,就是修改图层树中模型对象。 -
呈现树
:模型对象,携带动画进行期间CALayer
对象属性的当前值
。通过访问这些对象,获取图层对象
属性的当前值。 -
渲染树
:框架的私有对象,具体负责动画渲染。
CALayer
bounds
:设置其origin
成员变量没有作用。使用
non layer-backed
时,要将其属性contentsScale
设置为[UIScreen mainScreen].scale
;否则图层所显示内容的缩放系数
会同屏幕的实际缩放系数不一致。手动调用图层的
setNeedsDisplay
方法,其drawInContext:
或代理方法drawLayer:inContext:
才会被调用。时间转换
:layer.speed = 0;
convertTime:toLayer:
convertTime:fromLayer:
,注意,给后一个参数传nil,一般用于将系统绝对时间转换为图层本地时间,如:
// 将系统绝对时间转换为图层本地时间(考虑到speed等因素)
CFTimeInterval localTime = [self.layer convertTime:CACurrentMediaTime() fromLayer:nil];
动画触发类型
-
隐式动画
,不创建CAAnimation
对象,直接修改CALayer
对象的属性,自动产生动画效果。 - 更新
图层树
中相应的属性值至动画将结束状态。即动画结束后,图层对象的状态就是动画的终止状态。 - 对于
UIView
的root layer
,必须在animation block
中进行修改,否则不会产生隐式动画。 - 对于在
animation block
外的隐式动画来说,其duration
默认0.25秒。相反,其duration
等同于动画block的duration
参数。
// 数据流向
交割对象--->图层树--->绘图树--->呈现树
-
显示动画
:创建并配置CAAnimation
,将其添加至CALayer
对象,从而产生动画效果。 - 不更新
图层树
中相应的属性值。即动画结束后,图层对象回到动画执行前的状态。 - 直接作用于对于
UIView
的root layer
,不必放入animation block
中。 - 如果将显式动画放在
animation block
,一样可以执行。但其duration
不会被覆盖,默认为0.25
(如果没有设置)或设定值
。
// 数据流向
交割对象--->绘图树--->呈现树
CAAnimation
- removedOnCompletion:动画结束后,动画模型是否被移除
CALayer
的animations
字典。 - 注意,这个属性需要和
fillMode
配合使用,后者决定动画模型带来的呈现效果在动画结束后是否保留。例如,想要让CALayer
对象在每次动画结束后都保持动画结束后的状态,需要如下设置:
// 保持动画结束时的状态
anim.removedOnCompletion = NO; // 注意,这个属性默认YES,即动画结束后,动画模型将从`CALayer`中移除。如果动画模型不再存在,其呈现效果肯定也不会存在。
anim.fillMode = kCAFillModeForwards;
注意,冻结动画状态不代表修改了
图层树
中属性模型的值;相反,属性值保持不变,修改的和保存的仅仅是呈现树中的模型。代理方法
animationDidStart:
,动画开始时调用。animationDidStop:finished:
,动画结束,或者从图层上移除时调用。注意,不需遵守代理协议,只需将对象设置为动画模型的
delegate
即可。注意,动画模型对其
delegate
进行强引用
。
CAPropertyAnimation / 属性动画
-
animationWithKeyPath:
,创建一个属性动画对象,并为其指定相对于CALayer
对象属性的keyPath
。
CABasicAnimation / 差值动画
- 差值计算方法
-
fromValue
,简称'f'。 -
toValue
,简称't' -
byValue
,简称'b'。
组合 | 起点 | 终点
---- | ----- | -----
f + t | f | t
f + b | f | f + b
t + b | t - b | t
f | f | 当前值
t | 当前值 | t
b | 当前值 | 当前值 + b
都不存在 | 之前值 | 当前值(需要手动修改`CALayer`对象的属性值)
CAKeyFrameAnimation / 关键帧动画
path
, 用于定义CGPoint
类型属性的关键帧。keyTimes
:包含若干个NSNumber
的数组,元素个数等于values.count
或者path
中control point
的数量。元素的值限定在
0.0~1.0之间
,代表关键帧在整个动画中的介入时机
。(例如,@[@0, @0.5 @1.0]
表示关键帧依次在动画总持续时间的%0,%50和%100开始执行)这个属性只在特定的
calculation mode
下有效。calculationMode
,关键帧之间的过渡值的计算方式。
kCAAnimationLinear; // 线性计算(适用keyTimes值)
kCAAnimationDiscrete; // 离散计算,即不计算过渡值(适用keyTimes值)
kCAAnimationPaced; // 同步计算,即平均计算
kCAAnimationCubic; // 立方计算(适用keyTimes值)
kCAAnimationCubicPaced; // 立方同步计算
CAAnimationGroup / 分组动画
- 用于同时触发多个动画效果。
- 分组动画的属性会覆盖其子动画模型的相同属性。
- 注意,如果一个子动画的
duration
为10秒,而分组动画时长为5秒。那么子动画只能显示其前5秒的动画效果。
CATransition / 转场动画
- 利用预先保存的图层内容(位图),为视图创建转场动画效果。
-
startProgress
,转场过程的开始位置。例如,将这属性设置为0.5,动画效果表现为从中间开始转场。 -
endProgress
,转场过程的结束位置。例如,将这属性设置为0.5,动画效果表现为转场进行至一半就结束。 -
type
,转场动画效果类型。 把私有效果列出来 -
subtype
,转场动画效果方向。(有些效果设置这个属性无效)