第11章 图层时间
11.1 CAMediaTiming协议
duration
和 repeatCount
默认都是0。但这不意味着动画时长为0秒,或者0 次,这里的0仅仅代表了“默认”,也就是0.25秒和1次。
还有一个repeatDuration
属性,它让动画重复一个指 定的时间,而不是指定次数。你甚至设置一个叫做autoreverses
的属性(BOOL 类型)在每次间隔交替循环过程中自动回放
相对时间
Core Animation,时间都是相对的,每个动画都有它自己描述的时间, 可以独立地加速,延时或者偏移。
beginTime
指定了动画开始之前的的延迟时间。默认是0(就是说动画会立刻执行)。
speed
是一个时间的倍数,默认1.0,减少它会减慢图层/动画的时间,增加它会 加快速度。如果2.0的速度,那么对于一个 duration 为1的动画,实际上在0.5秒 的时候就已经完成了。
timeOffset
是让动画快进到某一点,例如,对于一个持续1秒的动画
为0.5意味着动画将从一半的地方开始,然后走完一个完整的动画周期
fillMode
动画之间的间隙处理方式,是四种字符串常量,默认是 kCAFillModeRemoved
kCAFillModeForwards
kCAFillModeBackwards
kCAFillModeBoth
kCAFillModeRemoved
11.2 层级关系时间
对CALayer和CAGroupAnimation调整duration和repeatCount/repeatDuration属性并不会影响到子动画。但 beginTime,timeOffset和speed 属性将会影响到子动画。
全局时间和本地时间
CoreAnimation有一个全局时间的概念,也就是所谓的马赫时间(“马赫”实际上是 iOS和Mac OS系统内核的命名)
用CACurrentMediaTime
函数来访问马赫时间:
CFTimeInterval time = CACurrentMediaTime()
因此马赫时间对长时间测量并不有用。比如用CACurrentMediaTime去更新一个实时闹钟并不明智。(可以用[NSDate date]代替,就像第三章例子所示)。
每个CALayer和CAAnimation实例都有自己本地时间的概念,是根据父图层/动画层级关系中的beginTime,timeOffset和speed属性计算。就和转换不同图层之间坐标关系一样,CALayer同样也提供了方法来转换不同图层之间的本地时间。如下:
- (CFTimeInterval)convertTime:(CFTimeInterval)t fromLayer:(CALayer *)l;
- (CFTimeInterval)convertTime:(CFTimeInterval)t toLayer:(CALayer *)l;
11.3 手动动画
timeOffset一个很有用的功能在于你可以它可以让你手动控制动画进程,通过设置speed为0,可以禁用动画的自动播放,然后来使用timeOffset来来回显示动画序列。这可以使得运用手势来手动控制动画变得很简单。
举个简单的例子:还是之前关门的动画,修改代码来用手势控制动画。我们给视图添加一个UIPanGestureRecognizer,然后用timeOffset左右摇晃。