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

SwiftUI导航栏可见性动画异常:内容跳转而非平滑过渡

导航栏可见性动画与内容平滑过渡问题

想要实现导航栏可见性切换的动画效果,同时让屏幕内容随导航栏平滑上下移动,但尝试多种方法都存在问题:

  • 使用animation(_:value:)修饰符时,导航栏能实现平滑动画,但屏幕内容会直接跳转,没有平滑过渡效果
  • 使用无value参数的animation(_:)修饰符可以解决内容跳转问题,但该方法已被弃用,还存在其他副作用
  • 将按钮操作包裹在withAnimation代码块中也无法解决问题

示例代码如下:

struct ContentView: View {
    @State private var showNavBar = true

    var body: some View {
        NavigationStack {
            Button("Toggle nav bar") {
                showNavBar.toggle()
            }
            .navigationTitle("Test")
            .toolbar(showNavBar ? .visible : .hidden)
            .animation(.default, value: showNavBar)
        }
    }
}

当前效果:按钮位置无平滑动画
效果展示

变通方案

未找到完美解决方案,最终采用以下可行的变通方法:

import SwiftUI

public extension View {
    func navigationBar(visible: Bool) -> some View {
        modifier(NavigationBarVisibleViewModifier(visible: visible))
    }
}

private struct NavigationBarVisibleViewModifier: ViewModifier {
    let visible: Bool
    @State private var isAnimatingNavigationBar = false
    @State private var visibility: Visibility = .visible

    init(visible: Bool) {
        self.visible = visible
        self.visibility = visible ? .visible : .hidden
    }

    func body(
        content: Content
    ) -> some View {
        content
            .toolbar(visibility)
            .onChange(of: visible) { newValue in
                isAnimatingNavigationBar = true
                visibility = newValue ? .visible : .hidden
            }
            .transaction { transaction in
                if isAnimatingNavigationBar {
                    transaction.animation = .easeOut(duration: 0.2)
                    transaction.disablesAnimations = true
                    
                    DispatchQueue.main.async {
                        isAnimatingNavigationBar = false
                    }
                }
            }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 07:03:15