横屏视图下导航栏高度异常:需设置全方向固定Navigation bar尺寸
嘿,这个需求其实很好实现,我给你分享两个亲测有效的方案,你可以根据自己的项目情况选:
方案一:自定义UINavigationBar子类(最可靠)
这个方法是通过重写导航栏的尺寸计算逻辑,强制让它返回你想要的固定高度,不管屏幕怎么旋转都不会改变。
步骤:
- 创建一个自定义导航栏类,继承自
UINavigationBar - 重写
sizeThatFits(_:)方法,返回你设定好的固定宽高(比如你需要的64) - 在初始化导航控制器时指定使用这个自定义类,或者在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就搞定了。
方案二:通过调整约束(适合已有导航栏的场景)
如果不想自定义子类,也可以直接给导航栏添加固定高度约束,覆盖系统的自动调整逻辑。
步骤:
- 获取导航栏的引用
- 移除系统自动添加的高度约束(如果存在)
- 添加一个固定高度的约束
代码示例(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




