iOS/Swift中设置自定义NavigationBar的最简单方法是什么?
不需要必须隐藏系统默认NavigationBar,根据你要兼容的iOS系统版本有更简单的实现方案:

方案1:iOS 16+ 原生实现(最简方案)
iOS 16开始系统提供了导航栏自定义高度的官方API,不需要做额外适配,直接调整高度后添加自定义标签即可:
- 调用
UINavigationBar的customHeight属性设置你需要的导航栏总高度 - 直接把自定义文本标签添加到navigationBar的子视图中,调整布局到对应位置即可
参考代码:
if #available(iOS 16.0, *) { // 设置自定义导航栏高度,可根据需求调整 navigationController?.navigationBar.customHeight = 80 } else { // 低版本给导航栏额外增加顶部安全区高度 navigationController?.additionalSafeAreaInsets.top = 20 } // 添加上方文本标签 let topTipLabel = UILabel() topTipLabel.text = "你要显示的提示文本" topTipLabel.font = .systemFont(ofSize: 12) topTipLabel.textColor = .secondaryLabel navigationController?.navigationBar.addSubview(topTipLabel) // 配置标签布局,这里示例放在左侧导航按钮上方,可根据需求调整 topTipLabel.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ topTipLabel.topAnchor.constraint(equalTo: navigationController!.navigationBar.topAnchor, constant: 6), topTipLabel.leadingAnchor.constraint(equalTo: navigationController!.navigationBar.leadingAnchor, constant: 16) ])
方案2:全版本兼容方案(无需完全隐藏系统导航栏)
如果需要兼容iOS 15及更早版本,也不需要完全隐藏系统导航栏,只需要做视觉层替换即可:
- 把系统导航栏的背景设置为透明,隐藏默认底部分割线
- 在当前ViewController的view顶部添加一个自定义高度的UIView,刚好覆盖整个系统导航栏区域,你需要的文本、按钮等元素都放在这个自定义View里
- 系统导航栏的原有能力(侧滑返回、导航栈管理等)都可以正常使用,不需要自己额外实现交互逻辑,开发成本比完全自定义导航栏低很多
什么时候需要完全隐藏系统导航栏自定义?
只有当你的导航栏有非常特殊的交互效果(比如滚动联动渐变、自定义转场动画、异形导航栏样式等)时,才需要调用navigationController?.setNavigationBarHidden(true, animated: false)完全隐藏系统导航栏,自己实现完整的自定义导航栏组件。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

