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
相关产品推荐
相关产品推荐

