Canoe

iOS核心动画实践八(图层时间)

2017.06.22

这一部分主要是学习图层动画时间的控制。

CAMediaTiming协议

CAMediaTiming协议定义了在一段动画内用来控制逝去时间的属性的集合,CALayer和CAAnimation都实现了这个协议,所以时间可以被任意基于一个图层或者一段动画的类控制。

协议内部属性含义

CAMediaTiming 协议
* beginTime 延迟多长时间开始动画
* fillMode 定义在动画时间之外图层如何显示(展示动画前,动画后以及同时展示)
* autoreverses  动画完成之后反过来回到动画之前的状态
* duration CFTimeInterval类型,动画实践
* repeatCount 重复次数
* repeatDuration 使动画在给定时间内不停重复播放
* speed 动画速度,如果设置为2,相当于两倍的速度做动画
* timeOffset  动画从指定时间开始,和begintime不同

层级关系时间

图层是分层的,动画也是分层的,动画时间相对于他们来说也是由自己的层级的。
CALayer和CAAnimation都实现了CAMediaTiming协议。
那么假设对父级layer加动画速度speed为2,然后再给子的layer设置动画速度speed为2,那么子图层的动画速度为4倍。
假设对CAAnimationGroup设置speed为2,再给group中的animation设置speed为2,那么animation的动画速度为4倍。

全局时间和本地时间

全局时间就是马赫时间,马赫时间相对系统是全局的,不同设备不一致,设备休眠的时候会暂停。
CFTimeInterval time = CACurrentMediaTime();
本地时间就是根据begintime,timeoffset,speed来计算的,具体调用的方法。

- (CFTimeInterval)convertTime:(CFTimeInterval)t fromLayer:(CALayer *)l; 
- (CFTimeInterval)convertTime:(CFTimeInterval)t toLayer:(CALayer *)l;

暂停,倒回和快进

我们可以设置图层的speed为0来暂停动画,对动画设置speed为0没有用,因为动画被添加到图层之后不能再修改它了。
因为动画也有分层,所以我们可以设置主窗口的speed,可以暂停整个应用程序的动画,这个可以让我们更方便的调试动画效果。
self.window.layer.speed = 100

手动动画

timeoffset让我们可以手动控制动画的进程,设置speed为0,可以禁用动画自动播放,然后使用timeoffset来来回显示动画,或者实现手势控制动画。

Comments
Write a Comment