Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 10 additions & 10 deletions 9-图层时间/图层时间.md
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
#图层时间
# 图层时间

>*时间和空间最大的区别在于,时间不能被复用* -- 弗斯特梅里克

在上面两章中,我们探讨了可以用`CAAnimation`和它的子类实现的多种图层动画。动画的发生是需要持续一段时间的,所以*计时*对整个概念来说至关重要。在这一章中,我们来看看`CAMediaTiming`,看看Core Animation是如何跟踪时间的。

##`CAMediaTiming`协议
## `CAMediaTiming`协议

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

###持续和重复
### 持续和重复

我们在第八章“显式动画”中简单提到过`duration`(`CAMediaTiming`的属性之一),`duration`是一个`CFTimeInterval`的类型(类似于`NSTimeInterval`的一种双精度浮点类型),对将要进行的动画的一次迭代指定了时间。

Expand Down Expand Up @@ -131,7 +131,7 @@
@end
```

###相对时间
### 相对时间

每次讨论到Core Animation,时间都是相对的,每个动画都有它自己描述的时间,可以独立地加速,延时或者偏移。

Expand Down Expand Up @@ -215,7 +215,7 @@

图9.3 测试时间偏移和速度的简单的应用程序

###`fillMode`
### `fillMode`

对于`beginTime`非0的一段动画来说,会出现一个当动画添加到图层上但什么也没发生的状态。类似的,`removeOnCompletion`被设置为`NO`的动画将会在动画结束的时候仍然保持之前的状态。这就产生了一个问题,当动画开始之前和动画结束之后,被设置动画的属性将会是什么值呢?

Expand All @@ -234,13 +234,13 @@

这就对避免在动画结束的时候急速返回提供另一种方案(见第八章)。但是记住了,当用它来解决这个问题的时候,需要把`removeOnCompletion`设置为`NO`,另外需要给动画添加一个非空的键,于是可以在不需要动画的时候把它从图层上移除。

##层级关系时间
## 层级关系时间

在第三章“图层几何学”中,你已经了解到每个图层是如何相对在图层树中的父图层定义它的坐标系的。动画时间和它类似,每个动画和图层在时间上都有它自己的层级概念,相对于它的父亲来测量。对图层调整时间将会影响到它本身和子图层的动画,但不会影响到父图层。另一个相似点是所有的动画都被按照层级组合(使用`CAAnimationGroup`实例)。

对`CALayer`或者`CAAnimationGroup`调整`duration`和`repeatCount`/`repeatDuration`属性并不会影响到子动画。但是`beginTime`,`timeOffset`和`speed`属性将会影响到子动画。然而在层级关系中,`beginTime`指定了父图层开始动画(或者组合关系中的父动画)和对象将要开始自己动画之间的偏移。类似的,调整`CALayer`和`CAGroupAnimation`的`speed`属性将会对动画以及子动画速度应用一个缩放的因子。

###全局时间和本地时间
### 全局时间和本地时间

CoreAnimation有一个*全局时间*的概念,也就是所谓的*马赫时间*(“马赫”实际上是iOS和Mac OS系统内核的命名)。马赫时间在设备上所有进程都是全局的--但是在不同设备上并不是全局的--不过这已经足够对动画的参考点提供便利了,你可以使用`CACurrentMediaTime`函数来访问马赫时间:

Expand All @@ -261,7 +261,7 @@ CoreAnimation有一个*全局时间*的概念,也就是所谓的*马赫时间*
当用来同步不同图层之间有不同的`speed`,`timeOffset`和`beginTime`的动画,这些方法会很有用。


###暂停,倒回和快进
### 暂停,倒回和快进

设置动画的`speed`属性为0可以暂停动画,但在动画被添加到图层之后不太可能再修改它了,所以不能对正在进行的动画使用这个属性。给图层添加一个`CAAnimation`实际上是给动画对象做了一个不可改变的拷贝,所以对原始动画对象属性的改变对真实的动画并没有作用。相反,直接用`-animationForKey:`来检索图层正在进行的动画可以返回正确的动画对象,但是修改它的属性将会抛出异常。

Expand All @@ -276,7 +276,7 @@ CoreAnimation有一个*全局时间*的概念,也就是所谓的*马赫时间*

你也可以通过这种方式来*减速*,但其实也可以在模拟器通过切换慢速动画来实现。

##手动动画
## 手动动画

`timeOffset`一个很有用的功能在于它可以让你手动控制动画进程,通过设置`speed`为0,可以禁用动画的自动播放,然后来使用`timeOffset`来来回显示动画序列。这可以使得运用手势来手动控制动画变得很简单。

Expand Down Expand Up @@ -345,6 +345,6 @@ CoreAnimation有一个*全局时间*的概念,也就是所谓的*马赫时间*

在这个例子中的确是这样,但是对于比如说关键这这样更加复杂的情况,或者有多个图层的动画组,相对于实时计算每个图层的属性而言,这就显得方便的多了。

##总结
## 总结

在这一章,我们了解了`CAMediaTiming`协议,以及Core Animation用来操作时间控制动画的机制。在下一章,我们将要接触`缓冲`,另一个用来使动画更加真实的操作时间的技术。