第11章 图层时间

2018-09-08  本文已影响7人  cdd48b9d36e0

11.1 CAMediaTiming协议

durationrepeatCount 默认都是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左右摇晃。

上一篇下一篇

猜你喜欢

热点阅读