|
2 | 2 |
|
3 | 3 | > 如果想让事情变得顺利,只有靠自己 -- 夏尔·纪尧姆 |
4 | 4 |
|
5 | | -上一章介绍了隐式动画的概念。隐式动画是在iOS平台创建动态用户界面的一种直接方式,也是UIKit动画机制的基础,不过它并不能涵盖所有的动画类型。在这一章中,我们将要研究一下*显式动画*,它能够对一些属性做指定的自定义动画,或者创建非线性动画,比如沿着任意一条曲线移动。 |
| 5 | +上一章介绍了隐式动画的概念。隐式动画是iOS平台上创建动态用户界面的一种简单方式,也是UIKit动画机制的基础,不过它并不能涵盖所有的动画类型。在这一章中,我们将要研究一下*显式动画*,它能够对一些属性做指定的自定义动画,或者创建非线性动画,比如沿着任意一条曲线移动。 |
6 | 6 |
|
7 | 7 | ##属性动画 |
8 | 8 |
|
@@ -215,7 +215,7 @@ self.colorLayer.backgroundColor = color.CGColor; |
215 | 215 |
|
216 | 216 | 当使用`-addAnimation:forKey:`把动画添加到图层,这里有一个到目前为止我们都设置为`nil`的`key`参数。这里的键是`-animationForKey:`方法找到对应动画的唯一标识符,而当前动画的所有键都可以用`animationKeys`获取。如果我们对每个动画都关联一个唯一的键,就可以对每个图层循环所有键,然后调用`-animationForKey:`来比对结果。尽管这不是一个优雅的实现。 |
217 | 217 |
|
218 | | -幸运的是,还有一种更加简单的方法。像所有的`NSObject`子类一样,`CAAnimation`实现了KVC(键-值-编码)协议,于是你可以用`-setValue:forKey:`和`-valueForKey:`方法来存取属性。但是`CAAnimation`有一个不同的性能:它更像一个`NSDictionary`,可以让你随意设置键值对,即使和你使用的动画类所声明的属性并不匹配。 |
| 218 | +幸运的是,还有一种更加简单的方法。像所有的`NSObject`子类一样,`CAAnimation`实现了KVC(键-值-编码)协议,于是你可以用`-setValue:forKey:`和`-valueForKey:`方法来存取属性。但是`CAAnimation`有一个与众不同的特性:它更像一个`NSDictionary`,可以让你随意设置键值对,即使和你使用的动画类所声明的属性并不匹配。 |
219 | 219 |
|
220 | 220 | 这意味着你可以对动画用任意类型打标签。在这里,我们给`UIView`类型的指针添加的动画,所以可以简单地判断动画到底属于哪个视图,然后在委托方法中用这个信息正确地更新钟的指针(清单8.4)。 |
221 | 221 |
|
@@ -310,7 +310,7 @@ self.colorLayer.backgroundColor = color.CGColor; |
310 | 310 |
|
311 | 311 | `CAKeyframeAnimation`是另一种UIKit没有暴露出来但功能强大的类。和`CABasicAnimation`类似,`CAKeyframeAnimation`同样是`CAPropertyAnimation`的一个子类,它依然作用于单一的一个属性,但是和`CABasicAnimation`不一样的是,它不限制于设置一个起始和结束的值,而是可以根据一连串随意的值来做动画。 |
312 | 312 |
|
313 | | -*关键帧*起源于传动动画,意思是指主导的动画在显著改变发生时重绘当前帧(也就是*关键*帧),每帧之间剩下的绘制(可以通过关键帧推算出)将由熟练的艺术家来完成。`CAKeyframeAnimation`也是同样的道理:你提供了显著的帧,然后Core Animation在每帧之间进行插入。 |
| 313 | +*关键帧*起源于传动动画,意思是指主导的动画在显著改变发生时重绘当前帧(也就是*关键*帧),每帧之间剩下的绘制(可以通过关键帧推算出)将由熟练的艺术家来完成。`CAKeyframeAnimation`也是同样的道理:你提供了显著的帧,然后Core Animation在每帧之间进行插值。 |
314 | 314 |
|
315 | 315 | 我们可以用之前使用颜色图层的例子来演示,设置一个颜色的数组,然后通过关键帧动画播放出来(清单8.5) |
316 | 316 |
|
@@ -578,7 +578,7 @@ self.colorLayer.backgroundColor = color.CGColor; |
578 | 578 |
|
579 | 579 | 我们在第七章的例子中就已经用到过`kCATransitionPush`,它创建了一个新的图层,从边缘的一侧滑动进来,把旧图层从另一侧推出去的效果。 |
580 | 580 |
|
581 | | -`kCATransitionMoveIn`和`kCATransitionReveal`与`kCATransitionPush`类似,都实现了一个定向滑动的动画,但是有一些细微的不同,`kCATransitionMoveIn`从顶部滑动进入,但不像推送动画那样把老土层推走,然而`kCATransitionReveal`把原始的图层滑动出去来显示新的外观,而不是把新的图层滑动进入。 |
| 581 | +`kCATransitionMoveIn`和`kCATransitionReveal`与`kCATransitionPush`类似,都实现了一个定向滑动的动画,但是有一些细微的不同,`kCATransitionMoveIn`从顶部滑动进入,但不像推送动画那样把老图层推走,然而`kCATransitionReveal`把原始的图层滑动出去来显示新的外观,而不是把新的图层滑动进入。 |
582 | 582 |
|
583 | 583 | 后面三种过渡类型都有一个默认的动画方向,它们都从左侧滑入,但是你可以通过`subtype`来控制它们的方向,提供了如下四种类型: |
584 | 584 |
|
@@ -730,7 +730,7 @@ self.colorLayer.backgroundColor = color.CGColor; |
730 | 730 | @end |
731 | 731 | ``` |
732 | 732 |
|
733 | | -文档暗示过在iOS5(带来了Core Image框架)之后,可以通过`CATransition`的`filter`属性,用`CIFilter`来创建其它的过渡效果。然是直到iOS6都做不到这点。试图对`CATransition`使用Core Image的滤镜完全没效果(但是在Mac OS中是可行的,也许文档是想表达这个意思)。 |
| 733 | +文档暗示过在iOS5(带来了Core Image框架)之后,可以通过`CATransition`的`filter`属性,用`CIFilter`来创建其它的过渡效果。然而直到iOS6都做不到这点。试图对`CATransition`使用Core Image的滤镜完全没效果(但是在Mac OS中是可行的,也许文档是想表达这个意思)。 |
734 | 734 |
|
735 | 735 | 因此,根据要实现的效果,你只用关心是用`CATransition`还是用`UIView`的过渡方法就可以了。希望下个版本的iOS系统可以通过`CATransition`很好的支持Core Image的过渡滤镜效果(或许甚至会有新的方法)。 |
736 | 736 |
|
|
0 commit comments