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

SwiftUI中withAnimation repeatForever重复动画异常问题求助

问题原因

你遇到的问题根源在于无限重复动画的使用方式错误:

  • 第一次点击时,xv从false切换为true,withAnimation(Animation.spring().repeatForever())让视图的缩放动画无限循环(自动在1倍和1.5倍之间切换),但此时xv的实际值已经是true,动画只是视觉上的循环效果。
  • 第二次点击时,xv切换为false,你再次给状态变化绑定了无限重复动画。此时SwiftUI会尝试取消旧动画并启动新动画,但两次无限动画的叠加导致动画系统冲突,最终视图卡在了目标尺寸(1倍),不再执行缩放。

另外,withAnimation的设计初衷是给单次状态过渡添加动画效果,并不适合用来创建无限循环的动画。

解决方案

把动画绑定到视图上,通过状态变量控制动画的开启/关闭,这样可以精准控制动画行为:

struct ani_repeat: View {
    
    @State private var isAnimating = false
    
    var body: some View {
        VStack {
            Text("Hello, World!")
                .scaleEffect(isAnimating ? 1.5 : 1)
                // 根据动画状态切换动画类型
                .animation(
                    isAnimating 
                    ? Animation.spring().repeatForever(autoreverses: true) 
                    : .spring(), 
                    value: isAnimating
                )
            
            Text("\(isAnimating ? "T" : "F")")
        }
        .onTapGesture {
            isAnimating.toggle()
        }
    }
}
代码说明
  • 用isAnimating状态变量控制动画的开启和关闭。
  • 当isAnimating为true时,给视图绑定无限重复的弹簧动画,实现持续缩放效果。
  • 当isAnimating为false时,用普通弹簧动画让视图平滑回到原尺寸,不会重复。
  • 每次点击只切换状态变量,动画逻辑由视图的.animation()修饰符处理,避免了动画冲突。

内容的提问来源于stack exchange,提问作者Blacko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 22:58:11