You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 13:06:10