关于Core Animation

层次

Core Animation是不会修改CALayer的属性的,它维护了三个平行的layer层次结构: model tree(模型层树)、presentation tree(表示层树)、rendering tree(渲染树).模型层反应了我们能直接看到的layer的状态,表示层是动画正在表现的状态的近似值,渲染层对Core Animation是私有的。

保持动画后状态

保持动画完成后状态的两种方法: 一:设置removedOnCompletionNO,并设置fillModekCAFillModeForward。二:在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 的关键帧动画,可以设置rotationModekCAAnimationRotateAuto 让视图根据角度旋转。

rotationModekCAAnimationRotateAuto

rotationModenil

参考资料:
Obj中国
卷首语
动画解释

你可能感兴趣的:(关于Core Animation)