iOS中UIView调用动画设置无限旋转却无效果是什么原因?
问题原因
- 你设置的动画起始旋转角度
0和结束旋转角度-2π在仿射变换的计算结果上完全等价,UIView的隐式动画系统会优先判断两个状态是否一致,如果一致就会直接跳过动画过程,不会触发你预期的旋转过渡。 - 另外UIView的animate方法做旋转动画时,本身存在角度归一的逻辑,系统会自动把旋转角度归一到
[-π, π]区间计算差值,两个等效的角度自然没有动画差值可以计算,所以不会出现旋转效果。
解决方法
方法1:使用Core Animation的CABasicAnimation实现(更推荐,性能更好,无限旋转更稳定)
let v2=UIView(frame: CGRect(x: 100, y: 100, width: 30, height: 30)) v2.backgroundColor=UIColor.orange view.addSubview(v2) // 添加无限旋转核心动画 let rotationAnim = CABasicAnimation(keyPath: "transform.rotation.z") rotationAnim.fromValue = 0 rotationAnim.toValue = -Double.pi * 2 rotationAnim.duration = 2 rotationAnim.repeatCount = .infinity rotationAnim.isRemovedOnCompletion = false rotationAnim.timingFunction = CAMediaTimingFunction(name: .linear) v2.layer.add(rotationAnim, forKey: "infiniteRotation")
方法2:调整UIView动画写法,拆分动画阶段
如果非要用UIView的animate方法,可以拆分单次旋转角度,避免起始和结束角度等效的问题:
let v2=UIView(frame: CGRect(x: 100, y: 100, width: 30, height: 30)) v2.backgroundColor=UIColor.orange view.addSubview(v2) func startInfiniteRotate() { UIView.animate(withDuration: 1, delay: 0, options: .curveLinear, animations: { v2.transform = v2.transform.rotated(by: -CGFloat(Double.pi)) }, completion: { [weak self] _ in self?.startInfiniteRotate() }) } // 启动动画 startInfiniteRotate()
内容的提问来源于stack exchange,提问作者aluzi992
相关产品推荐
相关产品推荐

