作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
为什么直接使用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一起玩。
最佳答案
重要的是要注意 transform
属性的动画不是通过分量矩阵插值完成的,而是通过将开始和结束转换分解为基元来完成的组件(旋转、平移等),然后从插值组件重新创建转换。
让我们考虑恒等和 2π 旋转变换之间的 2 秒动画,并问问自己“在 1 秒动画过去后会有什么变换?”。这两个矩阵本质上都是 0
弧度旋转。 0
和 0
之间的 50% 插值仍然是 0
,因此 1 秒后的最终矩阵也有 0
弧度旋转。
当您直接插入 transform.rotation
时,Core Animation 已经有了可用的原始组件——您实际上只是将旋转传递给它,而无需进行分解。 0
和 2π
之间的 50% 插值是 π
因此 1 秒后的最终矩阵是预期的 π
弧度旋转。
关于ios - 为什么 2π 旋转动画不适用于 CALayer.transform?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44813882/
我是一名优秀的程序员,十分优秀!