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

SwiftUI返回重入页面后自定义动画失效问题求助

解决SwiftUI返回后再次进入页面动画失效的问题

问题原因

你的CircularView依赖@State变量scale触发动画:第一次进入时,onAppear将scale从初始值1.0改为0.5,触发重复动画。但SwiftUI会缓存部分视图实例,当你返回再进入时,scale的值已经是0.5,再次调用withAnimation修改它为同一个值,没有状态变化,因此动画不会重新启动。

而系统的ProgressView内部独立管理动画状态,每次视图出现都会重新初始化动画,所以不受此问题影响。

解决方案

方案1:离开视图时重置状态

在CircularView中添加onDisappear回调,重置scale的初始值,确保下次进入时能再次触发状态变化:

struct CircularView: View {
    @State var scale = 1.0

    var body: some View {
        Circle()
            .frame(width: 200, height: 200)
            .scaleEffect(scale)
            .onAppear {
                let baseAnimation = Animation.easeInOut(duration: 1)
                let repeated = baseAnimation.repeatForever(autoreverses: true)

                withAnimation(repeated) {
                    scale = 0.5
                }
            }
            .onDisappear {
                // 重置scale为初始值
                scale = 1.0
            }
    }
}

方案2:进入时强制重置状态

如果不想依赖onDisappear,可以在onAppear中先同步重置scale,再启动动画:

struct CircularView: View {
    @State var scale = 1.0

    var body: some View {
        Circle()
            .frame(width: 200, height: 200)
            .scaleEffect(scale)
            .onAppear {
                // 先强制重置初始值,再触发动画
                scale = 1.0
                let baseAnimation = Animation.easeInOut(duration: 1)
                let repeated = baseAnimation.repeatForever(autoreverses: true)

                withAnimation(repeated) {
                    scale = 0.5
                }
            }
    }
}

补充说明

SwiftUI的@State变量与视图实例绑定,只要视图没有被完全销毁(比如NavigationSplitView的detail视图被缓存复用),@State的值会被保留。这是SwiftUI优化视图性能的特性,并非bug,只需根据场景手动管理状态的重置即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 13:44:51