iOS 15全局隐藏导航栏失效求助:push/侧滑返回时自动显示
解决方案1:自定义UINavigationController全局管控
创建自定义导航控制器类,统一接管导航栏状态,从根源避免系统转场时的状态重置:
class CustomNavigationController: UINavigationController { override func viewDidLoad() { super.viewDidLoad() // 初始化时直接隐藏导航栏 setNavigationBarHidden(true, animated: false) } // 重写push方法,确保跳转后导航栏保持隐藏 override func pushViewController(_ viewController: UIViewController, animated: Bool) { super.pushViewController(viewController, animated: animated) setNavigationBarHidden(true, animated: false) } // 重写批量设置控制器方法,同步强制隐藏导航栏 override func setViewControllers(_ viewControllers: [UIViewController], animated: Bool) { super.setViewControllers(viewControllers, animated: animated) setNavigationBarHidden(true, animated: false) } // 处理侧滑返回时的导航栏自动显示问题 override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() setNavigationBarHidden(true, animated: false) } }
将项目中所有UINavigationController替换为这个自定义类(包括SceneDelegate初始化、Storyboard配置)。
解决方案2:通过导航代理拦截转场状态
如果不想自定义导航控制器,可给导航控制器设置代理,在转场前后强制锁定导航栏隐藏状态:
// 在SceneDelegate或根控制器中设置代理 navController.delegate = self // 实现UINavigationControllerDelegate协议 extension SceneDelegate: UINavigationControllerDelegate { func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) { // 转场开始前就强制隐藏,避免动画过程中导航栏出现 navigationController.setNavigationBarHidden(true, animated: false) } func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) { // 转场完成后再次确认状态 navigationController.setNavigationBarHidden(true, animated: false) } }
关键注意事项
- 不要混用
navigationBar.isHidden = true和setNavigationBarHidden(_:animated:),系统内部优先维护后者的状态,统一使用setNavigationBarHidden方法控制。 - 侧滑返回时的导航栏显示问题,除了自定义导航控制器的
viewWillLayoutSubviews处理,也可给系统侧滑手势添加监听,触发时强制隐藏导航栏。
内容的提问来源于stack exchange,提问作者ambassador
相关产品推荐
相关产品推荐

