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

an0*_*an0 2 core-animation ios

为什么直接使用CATransform3Dfortransform不行

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

但用于CGFloat作品transform.rotation

let rotationAnimation2 = CABasicAnimation(keyPath: "transform.rotation")
rotationAnimation2.toValue = CGFloat.pi * 2
rotationAnimation2.duration = 1
Run Code Online (Sandbox Code Playgroud)

这里是可以玩的游乐场。

Bar*_*ski 5

需要注意的是,transform属性的​​动画不是通过按组件矩阵插值来完成的,而是通过将开始和结束变换分解为原始组件(旋转、平移等)然后重新创建来完成的插值分量的变换。

\n\n

让我们考虑一个在恒等和 2\xcf\x80 旋转变换之间的 2 秒动画,并问自己“1 秒动画结束后会出现什么变换?”。两个矩阵本质上都是0弧度旋转。0和之间的 50% 插值0仍然是0,因此 1 秒后的最终矩阵也有0弧度旋转。

\n\n

当您直接插值时,transform.rotationCore Animation 已经具有可用的原始组件 \xe2\x80\x93 ,您实际上只是将旋转交给它,无需进行分解。0和之间进行 50% 插值,2\xcf\x80因此\xcf\x801 秒后的最终矩阵是预期的\xcf\x80弧度旋转。

\n