iOS动画原理--CAMediaTiming

1,268 阅读2分钟


最近学习iOS动画相关的知识,对其中的timeOffset,beginTime,fillMode等概念不太理解,遂查阅资料,学习一个。

动画类的基础类,实现了CAMediaTiming协议,这个协议定义了8个属性,动画的所有时间控制相关的内容,都和这个协议有关。

为了是整个过程可视化,使用以下的方式表示:每个长方形代表一个单位时间块,这里取1秒。动画过程用颜色表示,黄色代表动画开始的状态,蓝色代表动画结束的状态,中间的渐变代表整个动画的过程。

duration

duration这个比较简单,表示动画从开始到结束的时长为1.5秒。

默认情况下,CAAnimation完成后会被从layer上移除移除,所以当动画完成后上图变为动画开始前的白色,而不是继续保持蓝色。

beginTime


这个图需要特别解释一下,beginTime并不是等于1,而是等于当前时间CACurrentMediaTime()+1  。表示给layer添加动画后,动画并不是立刻开始,而是1秒后开始。

fillMode

fillMode有四个选项:kCAFillModeForwardskCAFillModeBackwardskCAFillModeBothkCAFillModeRemoved

表示动画开始之前和动画完成之后的状态。 

kCAFillModeForwards 表示 动画完成,保持结束状态

kCAFillModeBackwards 表示 动画开始之前,保持初始的状态

kCAFillModeBoth 表示 kCAFillModeForwards & kCAFillModeBackwards

kCAFillModeRemoved 是fillMode的默认值,不做特殊处理


这里拿KCAFillModeBackwards举例,beginTime等于 CACurrentMediaTime()+1 ,在动画开始之前,仍然是黄色,即动画的初始状态。

autoreverses

autoreverses属性比较好理解,就是动画完成后,再倒放一遍。


repeatCount


重复次数

repeatDuration


重复时长,再repeatDuration的时间内,一直重复,时间到了就停下来。

speed


类似于看视频时的播放速度,speed等于0就是暂停。speed等于2就是二倍速,同时会使duration减半。原先3秒的动画,1.5秒就完成了。 

timeOffset


timeOffset,将原来的动画向左偏移timeOffset。然后将偏移的部分补到后面。

原文

Controlling Animation Timing