Swift导航栏显示异常:安全区域与导航栏存在间隙的解决求助
问题:导航栏与安全区域间存在间隙,显示异常
我不清楚为何导航栏显示异常,从截图可见安全区域与导航栏之间存在间隙。以下是我的自定义TabBar代码:
class TabBarController: UITabBarController { override func viewDidLoad() { super.viewDidLoad() self.setupBar() } // MARK: - Tab Setup private func setupBar() { self.setViewControllers([travelListNC(), mapNC()], animated: true) } private func travelListNC() -> UINavigationController { let storyboard = UIStoryboard(name: "TravelListViewController", bundle: Bundle.main) let travelsVC = storyboard.instantiateViewController(withIdentifier: "TravelListViewController") as! TravelListViewController travelsVC.tabBarItem.title = "Travels" travelsVC.tabBarItem.image = UIImage(systemName: "list.dash") return UINavigationController(rootViewController: travelsVC) } private func mapNC() -> UINavigationController { let storyboard = UIStoryboard(name: "MapViewController", bundle: Bundle.main) let mapVC = storyboard.instantiateViewController(withIdentifier: "MapViewController") as! MapViewController mapVC.title = "Map" mapVC.tabBarItem.title = "Map" mapVC.tabBarItem.image = UIImage(systemName: "map.fill") return UINavigationController(rootViewController: mapVC) } }
调用该TabBar的代码如下:
func homeView() { let tabBarController = TabBarController() let navController = UINavigationController(rootViewController: tabBarController) navController.modalPresentationStyle = .fullScreen present(navController, animated: true, completion: { let navController = tabBarController.viewControllers![0] as! UINavigationController let vc = navController.topViewController as! TravelListViewController vc.userLoged = self.userLoged }) }
我已在TravelListViewController中设置了导航栏标题。
解决方案
1. 移除多余的外层NavigationController
你的代码将TabBarController嵌套进了另一个UINavigationController,这会造成导航栏层级混乱,是间隙出现的核心原因。直接展示TabBarController即可:
修改homeView()代码:
func homeView() { let tabBarController = TabBarController() tabBarController.modalPresentationStyle = .fullScreen present(tabBarController, animated: true, completion: { let navController = tabBarController.viewControllers![0] as! UINavigationController let vc = navController.topViewController as! TravelListViewController vc.userLoged = self.userLoged }) }
2. 确保安全区域适配正确
如果修改层级后仍有问题,检查以下设置:
- 在
TravelListViewController和MapViewController中,设置正确的边缘延伸属性:
override func viewDidLoad() { super.viewDidLoad() // 让视图延伸到导航栏下方,自动适配安全区域 self.edgesForExtendedLayout = .all }
- 按需调整导航栏半透明属性(默认是
true):
navigationController?.navigationBar.isTranslucent = false
3. 检查Storyboard布局约束
打开对应Storyboard文件,确保ViewController根视图的顶部约束连接到安全区域顶部,而非视图顶部,避免出现间隙。
内容的提问来源于stack exchange,提问作者Boguhe Stephane
相关产品推荐
相关产品推荐

