You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

横屏视图下导航栏高度异常:需设置全方向固定Navigation bar尺寸

解决Navigation Bar横竖屏固定高度的问题

嘿,这个需求其实很好实现,我给你分享两个亲测有效的方案,你可以根据自己的项目情况选:

方案一:自定义UINavigationBar子类(最可靠)

这个方法是通过重写导航栏的尺寸计算逻辑,强制让它返回你想要的固定高度,不管屏幕怎么旋转都不会改变。

步骤:

  1. 创建一个自定义导航栏类,继承自UINavigationBar
  2. 重写sizeThatFits(_:)方法,返回你设定好的固定宽高(比如你需要的64)
  3. 在初始化导航控制器时指定使用这个自定义类,或者在Storyboard中直接设置

代码示例(Swift):

import UIKit

class FixedHeightNavigationBar: UINavigationBar {
    override func sizeThatFits(_ size: CGSize) -> CGSize {
        // 这里替换成你想要的固定高度,比如64
        let fixedHeight: CGFloat = 64
        return CGSize(width: UIScreen.main.bounds.width, height: fixedHeight)
    }
}

// 代码初始化导航控制器时的用法
let rootVC = YourRootViewController()
let navController = UINavigationController(
    navigationBarClass: FixedHeightNavigationBar.self,
    toolbarClass: nil
)
navController.viewControllers = [rootVC]

如果是用Storyboard开发,直接选中导航栏,在Identity Inspector里把Class改成FixedHeightNavigationBar就搞定了。

方案二:通过调整约束(适合已有导航栏的场景)

如果不想自定义子类,也可以直接给导航栏添加固定高度约束,覆盖系统的自动调整逻辑。

步骤:

  1. 获取导航栏的引用
  2. 移除系统自动添加的高度约束(如果存在)
  3. 添加一个固定高度的约束

代码示例(Swift):

// 在导航控制器的viewDidLoad里添加
override func viewDidLoad() {
    super.viewDidLoad()
    
    // 移除系统默认的高度约束
    navigationBar.constraints.forEach { constraint in
        if constraint.firstAttribute == .height {
            constraint.isActive = false
        }
    }
    
    // 添加固定高度约束
    navigationBar.heightAnchor.constraint(equalToConstant: 64).isActive = true
}

注意事项:

  • 如果你的项目需要适配刘海屏,记得考虑状态栏的高度,但如果是强制固定导航栏高度,这个方法依然生效,只是导航栏内的内容可能需要手动调整位置
  • 两种方案都能实现横竖屏高度固定,方案一更稳定,适合新项目;方案二更灵活,适合已有项目的快速修改

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

火山引擎 最新活动