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

iOS 11中如何修改UINavigationBar的高度?

iOS 11 中修改 UINavigationBar 高度的正确姿势

嘿,我来帮你搞定这个问题!你试的两种方法在 iOS 11 里没生效,其实是因为苹果从 iOS 11 开始调整了 UINavigationBar 的布局逻辑,老方法已经不适用啦。先给你分析下为什么那两种方法失效:

  • 方法一直接修改 frame:iOS 11 之后导航栏完全由 Auto Layout 管理,你手动设置的 frame 会被系统的布局约束自动修正,所以根本留不住自定义的高度。
  • 方法二重写 sizeThatFits:这个方法在 iOS 11 之后不再是导航栏高度的核心决定因素,系统优先参考 intrinsicContentSize 和内置约束,所以重写它不会有效果。

下面给你两种可行的解决方案,按需选择:

方案一:自定义导航栏(推荐)

通过自定义 UINavigationBar 并重写 intrinsicContentSize 属性,让系统认可你的自定义高度:

class CustomNavigationBar: UINavigationBar {
    // 这里设置你想要的导航栏高度
    var customHeight: CGFloat = 100

    override var intrinsicContentSize: CGSize {
        return CGSize(width: UIScreen.main.bounds.width, height: customHeight)
    }
}

然后在初始化导航控制器时,指定使用这个自定义导航栏:

// 初始化导航控制器时传入自定义导航栏类
let navController = UINavigationController(navigationBarClass: CustomNavigationBar.self, toolbarClass: nil)
// 如果你是在 Storyboard 里使用,需要手动替换导航栏的类为 CustomNavigationBar

方案二:通过占位视图撑开高度(无需自定义导航栏)

如果不想自定义导航栏,可以给导航栏添加一个占位视图,用约束强制撑开高度:

override func viewDidLoad() {
    super.viewDidLoad()
    
    // 关闭导航栏半透明,避免布局偏移
    navigationController?.navigationBar.isTranslucent = false
    navigationController?.navigationBar.barTintColor = .white
    
    let targetHeight: CGFloat = 100
    let extraHeight = targetHeight - 44 // 44 是 iOS 导航栏的默认高度
    
    // 创建占位视图
    let spacerView = UIView()
    spacerView.translatesAutoresizingMaskIntoConstraints = false
    navigationController?.navigationBar.addSubview(spacerView)
    
    // 添加约束,让占位视图撑开导航栏高度
    NSLayoutConstraint.activate([
        spacerView.heightAnchor.constraint(equalToConstant: extraHeight),
        spacerView.widthAnchor.constraint(equalTo: navigationController!.navigationBar.widthAnchor),
        spacerView.topAnchor.constraint(equalTo: navigationController!.navigationBar.topAnchor),
        spacerView.centerXAnchor.constraint(equalTo: navigationController!.navigationBar.centerXAnchor)
    ])
    
    // 可选:调整标题视图的位置,让它居中在自定义高度的导航栏里
    if let titleView = navigationItem.titleView {
        titleView.translatesAutoresizingMaskIntoConstraints = false
        titleView.centerYAnchor.constraint(equalTo: spacerView.centerYAnchor).isActive = true
    }
}

注意:如果你的导航栏需要半透明效果,需要额外调整布局,避免内容被导航栏遮挡。

内容的提问来源于stack exchange,提问作者dre_84w934

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:10:43