iOS Core Animation(七)- 图层时间
2016-12-22 本文已影响34人
莫须有恋
CAMediaTiming协议
CAMediaTiming
协议定义了在一段动画内用来控制逝去时间的属性的集合。
-
duration
和repeatCount
是CAMidiaTiming的属性,默认为0.25秒
和一次
。 -
speed
,是时间的倍数,假定一个duration为1的动画,如果speed为2,那么实际上0.5s就完成了动画 -
beginTime
指定动画开始之前的延迟时间,设置为延迟1s,例:CACurrentMediaTime()+1
-
timeOffset
是将动画快进到某一点,改变动画过程中的起始点 -
fillMode
,需要将removedOnCompletion
设置为NO
kCAFillModeRemoved 这个是默认值,也就是说当动画开始前和动画结束后,动画对layer都没有影响,动画结束后,layer会恢复到之前的状态
kCAFillModeForwards 当动画结束后,layer会一直保持着动画最后的状态
kCAFillModeBackwards 这个和kCAFillModeForwards是相对的,就是在动画开始前,你只要将动画加入了一个layer,layer便立即进入动画的初始状态并等待动画开始.你可以这样设定测试代码,将一个动画加入一个layer的时候延迟5秒执行.然后就会发现在动画没有开始的时候,只要动画被加入了layer,layer便处于动画初始状态
kCAFillModeBoth 理解了上面两个,这个就很好理解了,这个其实就是上面两个的合成.动画加入后开始之前,layer便处于动画初始状态,动画结束后layer保持动画最后的状态.
全局时间和本地时间
CoreAnimation有一个全局时间的概念,即马赫时间
-
CACurrentMediaTime
访问马赫时间。它返回了设备自上次启动后的秒数 - 每个CALayer和CAAnimation实例都有自己本地时间的概念,是根据beginTime、timeOffset和speed属性计算,类似于相对坐标转换,CALayer也提供了方法转换不同图层的本地时间:
- (CFTimeInterval)convertTime:(CFTimeInterval)t fromLayer:(nullable CALayer *)l;
- (CFTimeInterval)convertTime:(CFTimeInterval)t toLayer:(nullable CALayer *)l;
暂停,倒回和快进
- 设置图层的speed为0,暂停
- 负数 , 倒回
- 大于1,快进
想要加速所有视图动画self.window.layer.speed = 100;
手动控制动画
设置图层的speed为0,可以禁用动画的自动播放
使用timeOffset调整动画开始在整个动画过程中的时间点
对于一个复杂的动画,或者有多个图层的动画组,相对于实时计算图层的属性而言,这种方法会更加简单