swift - iOS Swift - 如何使用 CABasicAnimation 和 CATransform3DRotate 以及 "m34"变换来制作 360 度翻转动画?

标签 swift perspective cabasicanimation catransform3drotate

尽管我尽了最大努力,但我无法弄清楚如何使用 CATransform3DRotate 从左到右执行 UIView 的完整循环旋转动画。请注意,我已经可以使用 CABasicAnimation 将其旋转 360 度,但无需使用 CATransform3DRotate。但是,我想使用 .m34 变换来实现透视深度。涉及 UIView.animate/transitions 的解决方案对我想要完成的任务没有帮助。非常感谢任何帮助。

编辑:我在 Stackoverflow 和其他地方进行了广泛的搜索,但没有找到任何描述如何使用 CATransform3DRotate 进行 360 度旋转的内容。向顶级枪手寻求帮助,因为这是一个以前似乎没有得到解答的问题。谢谢!

这是将 UIView 旋转 180 度的代码。

var transform = CATransform3DIdentity
transform.m34 = 1.0 / -200.0

let animation = CABasicAnimation(keyPath: "transform")
animation.toValue = CATransform3DRotate(transform, CGFloat( Double.pi), 0, 1, 0)
animation.duration = 0.8
animation.beginTime = 0.0
animation.fillMode = .forwards
animation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut)
cardView.layer.add(animation, forKey: "360flip")

最佳答案

您当前的代码正在替换动画层的整个变换,这意味着您无法对其应用透视变换。您还存在最终状态在数学上与开始状态相同的问题,为了解决这个问题,您尝试将动画链接在一起并使用填充模式,这使整个事情变得更加复杂。

首先,让我们处理转换。要获得透视图,您需要设置图层变换的 .m34,您已经这样做了:

var perspective = CATransform3DIdentity
perspective.m34 = 1 / -200
cardView.layer.transform = perspective

接下来,为了只触及图层变换的旋转,您可以使用比 transform 更精确的关键路径:

let rotate = CABasicAnimation(keyPath: "transform.rotation.y")
rotate.fromValue = 0

这将使图层变换的其余部分保持不变。

最后,当动画结束与开始相同时,如何强制动画引擎注意到差异?使用byValue:

rotate.byValue = CGFloat.pi * 2

这会强制图层绕很远的距离旋转到 360 度,而不是偷懒地保持原样。

最终完整的代码是:

var perspective = CATransform3DIdentity
perspective.m34 = 1 / -200
cardView.layer.transform = perspective
let rotate = CABasicAnimation(keyPath: "transform.rotation.y")
rotate.fromValue = 0
rotate.byValue = CGFloat.pi * 2
rotate.duration = 2
cardView.layer.add(rotate, forKey: nil)

给出这个结果:

A label rotating 360 degrees with perspective

关于swift - iOS Swift - 如何使用 CABasicAnimation 和 CATransform3DRotate 以及 "m34"变换来制作 360 度翻转动画?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70530561/

相关文章:

ios - UICollectionViewCell 中的 UILabel 有时大小不正确

swift - 在获取 JSON 值中发布 SWIFT Alamofire

OpenGL 4.4 管道 - 裁剪前的透视划分?

ios - 在 iOS 中暂停和恢复动画的问题

IOS Swift 如何更改 1 个表格 View 单元格

ios - GCD 主线程崩溃问题(需要解释)?

java - 3D透视观察

javascript - EaselJS透视图像变换

ios - CABasicAnimation 旋转返回到原始位置

ios - CABasicAnimation + UIBezierPath