为什么直接使用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。
答案 0 :(得分:4)
重要的是要注意transform
属性的动画不通过分量矩阵插值完成,而是通过将开始和结束变换分解为基元组件来完成(旋转) ,翻译等)然后从插值组件重新创建变换。
让我们考虑身份和2π旋转变换之间的2秒动画,并问自己“动画播放1秒后会有什么变换?”。两个矩阵基本上都是0
弧度旋转。 0
和0
之间的50%插值仍为0
,因此1秒后的最终矩阵也有0
弧度旋转。
直接插入transform.rotation
时Core Animation已经有原始组件可用 - 你只需将旋转传递给它,就不需要进行分解。 0
和2π
之间的50%插值为π
,因此1秒后的最终矩阵是预期的π
弧度旋转。
答案 1 :(得分:1)
当你安装一个完整的CATransform3D
作为动画的toValue时,系统唯一要做的就是动画的起始状态和结束状态之间的差异。旋转2Π的变换和变换是相同的。因此,没有变化。
当您为transform.rotation
设置动画时,您可以向动画引擎提供有关您正在做什么以及您的意图的信息。它可以告诉您要围绕Z轴顺时针旋转对象。
创建CAAnimation核心动画时,将采用您在动画中设置的更改并确定如何应用它们。如果您只是提交一个已更改的CATransform3D,则Core Animation必须比较起始和结束变换,并弄清楚如何从开始到结束状态生成实际动画。例如,如果旋转小于1 /2π,则需要最短的旋转才能到达那里。如果您的变换旋转-3 /2π(在另一个方向上旋转270度),您的意图将会丢失并且仍然会旋转+ 45°。如果您改为对transform.rotation提交更改,则可以为Core Animation提供更多信息。