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

SwiftUI中.navigationBarHidden外观bug:第三页取消滑动返回导航栏显现

问题修复方案

这个bug的核心原因是:取消滑动返回手势时,UIKit内部会触发导航栏状态的临时重置,导致原本隐藏的导航栏意外显示。以下是具体修复步骤:

1. 强化UINavigationController的导航栏隐藏逻辑

修改你的UINavigationController扩展,增加对导航栏隐藏状态的强制维护,并监听手势状态:

import SwiftUI

extension UINavigationController: UIGestureRecognizerDelegate {
    override open func viewDidLoad() {
        super.viewDidLoad()
        interactivePopGestureRecognizer?.delegate = self
        // 初始就隐藏导航栏
        navigationBar.isHidden = true
    }

    override open func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        // 每次视图出现时确保导航栏隐藏
        navigationBar.isHidden = true
    }

    public func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        return viewControllers.count > 1
    }

    // 监听手势状态,取消/结束时再次隐藏导航栏
    public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, didChange state: UIGestureRecognizer.State) {
        if state == .cancelled || state == .ended {
            DispatchQueue.main.async {
                self.navigationBar.isHidden = true
            }
        }
    }
}

@main
struct testSheetApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

2. 更新SwiftUI视图的导航栏隐藏设置

在每个页面的视图中,将原有的.navigationBarHidden(true)配合更可靠的.toolbar隐藏设置(兼容iOS16+,低版本可保留原设置):

struct ContentView: View {
    var body: some View {
        NavigationView{
            ZStack{
                VStack{
                    NavigationLink(destination: {
                        ContentView2()
                    }, label: {
                        Text("new")
                    })
                }
            }
            .navigationBarHidden(true)
            .toolbar(.hidden, for: .navigationBar)
        }
    }
}

struct ContentView2: View {
    @Environment(\.presentationMode) var presentationMode
    
    var body: some View {
        ZStack{
            VStack{
                Button(action: {
                    presentationMode.wrappedValue.dismiss()
                }, label: {
                    Text("back")
                })
                NavigationLink(destination: {
                    ContentView3()
                }, label: {
                    Text("next")
                })
            }
        }
        .navigationBarHidden(true)
        .toolbar(.hidden, for: .navigationBar)
    }
}

struct ContentView3: View {
    @Environment(\.presentationMode) var presentationMode
    
    var body: some View {
        VStack{
            Button(action: {
                presentationMode.wrappedValue.dismiss()
            }, label: {
                Text("back")
            })
        }
        .navigationBarHidden(true)
        .toolbar(.hidden, for: .navigationBar)
    }
}

这样修改后,无论是正常滑动返回还是中途取消手势,导航栏都会保持隐藏状态,同时保留滑动返回的交互功能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 10:54:14