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

SwiftUI自定义LoadingView永久重复动画在NavigationView中显示异常

问题原因

异常动效是同一渲染周期内两个动画被合并触发导致的:

  • NavigationView的根视图初始布局时,会从默认的左上角位置调整到居中位置,这个布局变化被onAppear中触发的动画块捕获,被自动加上了过渡动效
  • 原本的旋转动画和位置过渡动效叠加,就出现了loading视图从左上角移入的效果

解决方案

可通过以下两种方法修复,同时使用效果更稳定:

方案1:强制根视图初始位置居中

在ContentView中给LoadingView外层套一个占满全屏的容器,让loading视图从渲染初始就处于屏幕中心,避免出现位置变化的动画:

struct ContentView: View {
    var body: some View {
        NavigationView {
            ZStack {
                // 用透明底色撑满整个屏幕
                Color.clear
                LoadingView()
            }
            .frame(maxWidth: .infinity, maxHeight: .infinity)
        }
    }
}

方案2:单独给旋转属性绑定动画

修改LoadingView的动画实现,仅让旋转效果响应isLoading状态的变化,避免捕获其他布局属性的变化:

struct LoadingView: View {
    @State private var isLoading = false
    var body: some View {
        Circle()
            .trim(from: 0, to: 0.8)
            .stroke(Color.primaryDota, lineWidth: 5)
            .frame(width: 30, height: 30)
            .rotationEffect(Angle(degrees: isLoading ? 360 : 0))
            // 仅对rotation属性生效,只响应isLoading的状态变化
            .animation(.linear(duration: 1).repeatForever(autoreverses: false), value: isLoading)
            .onAppear {
                isLoading.toggle()
            }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 01:21:03