层次
Core Animation
是不会修改CALayer
的属性的,它维护了三个平行的layer
层次结构: model tree
(模型层树)、presentation tree
(表示层树)、rendering tree
(渲染树).模型层反应了我们能直接看到的layer
的状态,表示层是动画正在表现的状态的近似值,渲染层对Core Animation
是私有的。
保持动画后状态
保持动画完成后状态的两种方法: 一:设置removedOnCompletion
为NO
,并设置fillMode
为kCAFillModeForward
。二:在addAnimation:
后将layer的属性置为动画后的属性。方法二性能优于方法一,如果将已完成的动画保持在 layer 上时,会造成额外的开销,因为渲染器会去进行额外的绘画工作。
动画的重用
addAnimation:
时layer
会拷贝一份动画对象,之后动画对象再发生改变,将不会影响原图层的动画。
[firstLayer addAnimation: animation];
animation.beginTime = CACurrentMediaTime() + 0.5;
[secondLayer addAnimation: animation];
对动画开始时间的修改将只影响第二个图层,这可以让我们有效地重用动画。
动画的 additive
属性为YES
时,动画中属性的值会叠加到modelLayer
上来产生presentationLayer
,也就是在原图层属性的基础上加上动画的属性值,这样动画中可以不必考虑原图层的具体属性值。
例如一个左右移动的关键帧动画:
CAKeyframeAnimation *animation = [CAKeyframeAnimation animation];
animation.keyPath = @"position.x";
animation.values = @[ @0, @10, @-10, @10, @0 ];
animation.duration = 0.4;
animation.additive = YES;
[layer addAnimation:animation forKey:@"shake"];
动画中的属性值,不需要带入layer
的属性去计算最左、最右和中间点的坐标,而是直接叠加在layer
的属性上。这样也有利于动画的重用。
rotationMode
使用path
的关键帧动画,可以设置rotationMode
为kCAAnimationRotateAuto
让视图根据角度旋转。
rotationMode
为kCAAnimationRotateAuto
rotationMode
为nil