UINavigationBar 框架高度返回 44.0 但实际上是 64.0

Posted

技术标签:

【中文标题】UINavigationBar 框架高度返回 44.0 但实际上是 64.0【英文标题】:UINavigationBar frame height returns 44.0 but is actually 64.0 【发布时间】:2016-10-23 12:28:30 【问题描述】:

我在情节提要中有一个 UINavigationController,它没有使用 AutoLayout。在状态栏可见的情况下,UINavigationBar 的实际高度是 64.0,但是当我登录 self.navigationBar.frame.size.height 时,我得到 44.0。如何获取 UINavigationBar 的实际高度?

我使用的是 Xcode 7.3,并且故事板是为 ios 6 构建的。

【问题讨论】:

【参考方案1】:

UINavigationBar 的高度为 44。你得到 64 的原因是你的状态栏是可见的,它的高度是 20

更新: 要计算高度,您可以:

let height = Double(UIApplication.shared.statusBarFrame.height) + Double(self.navigationController!.navigationBar.frame.height)

【讨论】:

有没有办法以编程方式获取 UINavigationBar 的可见高度,即在这种情况下为 64.0? @matteok,检查更新,也许是这样的。 我刚刚检查过,如果状态栏被隐藏,状态栏框架为 0.0,所以我认为检查 isStatusBar hidden 是不必要的。 navigationBar.height + statusBarHeight 在这两种情况下都可以解决问题。如果您同意,您可以编辑您的答案,我会将其标记为正确。 确实,不需要做检查添加它以使其更清晰。更新了答案@matteok。【参考方案2】:

不要使用幻数。使用视图控制器的topLayoutGuide.length 来获得正确的高度。导航栏高度和状态栏高度在运行时会发生变化,因此请在 viewDidLayoutSubviews 中运行您的代码以始终使用正确的值。

【讨论】:

据我所知,这仅在启用自动布局时有效 这不是真的,无论自动布局如何,布局指南都已正确设置。【参考方案3】:

最简洁的方法是只关心导航栏的位置和高度,而不是假设它上面有状态栏。 (事实上​​,如果手机方向是横向的,甚至不会有状态栏。 只需这样做:

let height = Double(self.navigationController!.navigationBar.origin.y) + Double(self.navigationController!.navigationBar.frame.height)

【讨论】:

以上是关于UINavigationBar 框架高度返回 44.0 但实际上是 64.0的主要内容,如果未能解决你的问题,请参考以下文章

像在 iOS 7 日历应用中一样设置 UINavigationBar 高度

iPhone:带按钮的 UINavigationBar - 调整高度

在自定义 UINavigationBar 中绘图,附加到顶部

UINavigationBar + UITabBar 的可用屏幕高度

UINavigationBar titleView 用于不同的方向

旋转到横向时自动调整 UINavigationBar 的大小