为什么2π旋转动画不适用于CALayer.transform?

时间:2017-06-28 23:05:13

标签: ios core-animation

为什么直接使用CATransform3D transform无效

let rotationAnimation1 = CABasicAnimation(keyPath: #keyPath(CALayer.transform))
rotationAnimation1.toValue = CATransform3DMakeRotation(.pi * 2, 0, 0, 1)
rotationAnimation1.duration = 1

CGFloat使用transform.rotation有效吗?

let rotationAnimation2 = CABasicAnimation(keyPath: "transform.rotation")
rotationAnimation2.toValue = CGFloat.pi * 2
rotationAnimation2.duration = 1

以下是Playground

2 个答案:

答案 0 :(得分:4)

重要的是要注意transform属性的动画通过分量矩阵插值完成,而是通过将开始和结束变换分解为基元组件来完成(旋转) ,翻译等)然后从插值组件重新创建变换。

让我们考虑身份和2π旋转变换之间的2秒动画,并问自己“动画播放1秒后会有什么变换?”。两个矩阵基本上都是0弧度旋转。 00之间的50%插值仍为0,因此1秒后的最终矩阵也有0弧度旋转。

直接插入transform.rotation时Core Animation已经有原始组件可用 - 你只需将旋转传递给它,就不需要进行分解。 0之间的50%插值为π,因此1秒后的最终矩阵是预期的π弧度旋转。

答案 1 :(得分:1)

当你安装一个完整的CATransform3D作为动画的toValue时,系统唯一要做的就是动画的起始状态和结束状态之间的差异。旋转2Π的变换和变换是相同的。因此,没有变化。

当您为transform.rotation设置动画时,您可以向动画引擎提供有关您正在做什么以及您的意图的信息。它可以告诉您要围绕Z轴顺时针旋转对象。

编辑:

创建CAAnimation核心动画时,将采用您在动画中设置的更改并确定如何应用它们。如果您只是提交一个已更改的CATransform3D,则Core Animation必须比较起始和结束变换,并弄清楚如何从开始到结束状态生成实际动画。例如,如果旋转小于1 /2π,则需要最短的旋转才能到达那里。如果您的变换旋转-3 /2π(在另一个方向上旋转270度),您的意图将会丢失并且仍然会旋转+ 45°。如果您改为对transform.rotation提交更改,则可以为Core Animation提供更多信息。