如何在最新版Xcode及iOS系统中调整Navigation Bar高度(无需自定义头部视图)?
无需自定义头部视图调整导航栏高度的方法
嘿,我太懂你在新版本Xcode和iOS里调整导航栏高度的纠结了——现在系统对导航栏的布局管控确实比以前严,但不用自定义头部视图也能搞定,给你分享两个实用方案:
方案1:子类化UINavigationBar(最稳定可靠)
这是iOS 11+之后官方推荐的做法,通过自定义导航栏子类来控制它的固有尺寸,完全不用替换成自定义头部视图:
首先创建一个UINavigationBar的子类,重写intrinsicContentSize来指定你想要的导航栏高度(比如我这里设为80pt,你可以按需修改):
class CustomHeightNavigationBar: UINavigationBar { override var intrinsicContentSize: CGSize { // 这里的height就是你要的导航栏自身高度 return CGSize(width: UIScreen.main.bounds.width, height: 80) } // 可选:调整导航栏内部元素(标题、左右按钮)的位置,避免偏移到奇怪的地方 override func layoutSubviews() { super.layoutSubviews() // 让标题视图垂直居中 titleView?.center = CGPoint(x: bounds.midX, y: bounds.midY) // 遍历调整所有导航按钮的垂直位置 for subview in subviews { if let navButton = subview as? UIButton { navButton.center.y = bounds.midY } } } }
接下来在你的导航控制器中使用这个子类:
- 如果是纯代码创建导航控制器:
let navController = UINavigationController(navigationBarClass: CustomHeightNavigationBar.self, toolbarClass: nil) navController.viewControllers = [YourRootViewController()]
- 如果是用Storyboard开发:选中导航栏,在右侧Identity Inspector面板里,把Class改成
CustomHeightNavigationBar即可。
方案2:直接调整导航栏Frame(适合快速测试)
如果你不想写子类,这个方法可以快速实现,但稳定性稍差(横竖屏切换或系统布局更新可能会重置):
override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) // 设置导航栏高度为80pt guard let navBar = navigationController?.navigationBar else { return } navBar.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: 80) // 调整页面内容的安全区域内边距,避免被增高的导航栏遮挡 let defaultNavBarHeight = UINavigationController().navigationBar.frame.height additionalSafeAreaInsets.top = 80 - defaultNavBarHeight } // 可选:横竖屏切换时重新设置,避免高度被重置 override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() guard let navBar = navigationController?.navigationBar else { return } navBar.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: 80) }
小提示
- 系统默认的导航栏自身高度是44pt(全面屏设备的状态栏额外占44pt,总顶部高度88pt),所以设置高度时别低于这个值,避免布局错乱。
- 如果需要调整整个顶部区域(状态栏+导航栏)的总高度,你可以结合
UIApplication.shared.statusBarFrame.height来计算。
内容的提问来源于stack exchange,提问作者jpatrick
相关产品推荐
相关产品推荐

