You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 22:15:03