CABasicAnimation
当更新属性的时候,我们需要设置一个新的事务,并且禁用图层行为。否则动画会发生两次,一个是因为显示的CABasicAnimation,另一个是因为隐式动画。
动画本身会作为一个参数传入委托的方法,也许你会认为可以控制器中把动画存储为一个属性,然后在回调用比较,但实际上不起作用,因为委托传入的动画参数是原始值的一个深拷贝,从而不是同一个值。CAAnimation实现了KVC协议。但是CAAnimation有一个不同的性能:它更像是一个NSDictionary,可以让你随意设置键值对,即使和你使用的动画所声明的属性并不匹配。
CAKeyframeAnimation
CABasicAnimation揭示了大多数隐式动画背后依赖的机制,但是显示的给图层添加CABasicAnimation相较于隐式动画而言,费力不讨好。
CAKeyframeAnimation同样是CAPropertyAnimation的一个子类,它依然作用于单一的一个属性,但是和CABasicAnimation不一样的是,它不限制于设置一个起始和结束的值,而是可以根据一连串随意的值来做动画。
CAKeyframeAnimation并不能自动把当前值作为第一帧。动画会在开始的时候突然跳到第一帧的值,然后在动画结束的时候恢复到初始值。
CAKeyframeAnimation有另一种方式去指定动画,就是使用CGPath。path属性可以用一种直观的方式,使用CoreGraphics函数定义运动序列来绘制动画。可以使用一个三次倍赛尔曲线,它是一种使用开始点,结束点和另外两个控制点来定义形状的曲线。
虚拟属性
属性动画实际上是针对于关键路径而不是一个键,这就意味着可以对子属性甚至是虚拟属性做动画。
为了旋转图层,我们可以对transform.rotation关键路径应用动画,而不是transform本身。
用transform.rotation而不是transform做动画的好处:
可以不通过关键帧一步旋转多于180度的动画;
可以用相对值而不是绝对值旋转;
可以不用创建CATransform3D,而是使用一个简单的数值来指定角度。
不会和transform.position或者transform.scale冲突。
transform.rotation属性其实并不存在。这是因为CATransform3D并不是一个对象,实际上是一个结构体,也没有符合kvc相关属性,transform.rotation实际上是一个CALayer用于处理动画变换的虚拟属性。
不可以直接设置transform.rotation或transform.scale,他们不能直接使用。当对他们做动画时,CoreAnimation自动地根据通过CAValueFunction来计算的值更新transform属性。
网友评论