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
相关产品推荐
相关产品推荐

