SwiftUI:动态调整风扇旋转动画速度问题求助
解决SwiftUI风扇动画实时调速问题
你的问题根源在于:当前代码中,动画仅在isOn状态切换时才会重新应用,而speed变化时,由于旋转目标值(360度)未改变,SwiftUI不会自动更新正在运行的动画参数。要实现实时调速,需要在speed变化时主动更新动画配置。
下面是修改后的代码,核心思路是通过跟踪当前旋转角度,在speed或isOn变化时,重新启动对应速度的无限旋转动画:
struct ContentView: View { @State private var isOn = false @State private var speed = 0.5 @State private var rotationAngle = 0.0 // 跟踪当前旋转角度 var body: some View { VStack{ Spacer() Image("fan") .rotationEffect(Angle(degrees: rotationAngle)) .onAppear { startFanAnimation() } .onChange(of: isOn) { _ in if isOn { startFanAnimation() } else { rotationAngle = 0.0 // 停止时重置角度 } } .onChange(of: speed) { _ in if isOn { startFanAnimation() // 调速时重启动画 } } Spacer() HStack{ Button("+"){ speed += 0.3 } Button("-"){ speed -= 0.3 } } Spacer() Toggle(isOn: $isOn){ } .labelsHidden() Text("\(String(format: "%.1f", speed))") // 优化显示格式 Spacer() } } // 封装启动风扇动画的逻辑 private func startFanAnimation() { // 先保留当前角度的余数,避免每次重启都跳回0度 rotationAngle = rotationAngle.truncatingRemainder(dividingBy: 360) withAnimation(Animation.linear.repeatForever(autoreverses: false).speed(speed)) { rotationAngle += 360 } } }
关键改动说明:
- 新增
rotationAngle状态变量跟踪当前旋转角度,避免调速或启停时出现角度跳变 - 封装
startFanAnimation()方法统一处理动画启动逻辑,在onAppear、isOn变化、speed变化时调用 - 每次启动动画前,将当前角度取模360,保证动画从当前位置继续旋转,过渡更自然
- 优化速度显示格式,避免过多小数位
内容的提问来源于stack exchange,提问作者Badr Bujbara
相关产品推荐
相关产品推荐

