如何在iOS 11中更改navigationBar的高度?

26

显然,在iOS 11中改变navigationBar的高度面临了一种新方法。 在之前的iOS版本中,可以通过隐藏默认的navigationBar并添加一个具有自定义框架的新navigationBar来更改其高度:

self.navigationController?.setNavigationBarHidden(true, animated: false)
let customNavigationBar = UINavigationBar(frame: CGRect(x: 0, y: 0, width: self.view.bounds.width, height: 64))
self.view.addSubview(customNavigationBar)

但似乎在iOS 11的xCode beta版本中它不起作用。无论新高度是多少,它始终保持在44个单位。

这就是我在xCode 9中得到的:

输入图像说明

有人知道如何解决这个问题吗?

6个回答

12

这只是一种hack方法,直到苹果公司修复这个漏洞。我遇到了同样的问题,所以我将导航栏的顶部约束从0改为20。

之前: 输入图片说明

之后: 输入图片说明

如果您的UINavigationBar背景颜色不是白色,这将使状态栏变为白色。您可以通过在特定的UIViewController中添加以下内容来解决此问题。

let statusBarView = UIView(frame: UIApplication.shared.statusBarFrame)
let statusBarColor = UIColor.red
statusBarView.backgroundColor = statusBarColor
view.addSubview(statusBarView)

前: enter image description here

后: enter image description here

这看起来像是一个冗长的hack,但仍比返回并使用Xcode 8.3编译要好。


这会增加被苹果拒绝的可能性。 - Mina
苹果只会拒绝使用不建议公开使用的私有API的应用程序。话虽如此,在苹果修复该问题之前,您可以采用这种风格。 - Ameya Vichare
1
这是一个稳定的解决方案,直到苹果修复这个漏洞。感谢您的发布! - D. Greg
你能否添加更新导航栏顶部约束的代码吗?谢谢。 - Sean Lintern

12

你的代码没有问题。如果你改变customNavigationBar的背景颜色,你会发现你能得到所需高度的导航栏。但似乎在Xcode 9中隐藏默认导航栏存在问题。

下面是你的代码:

Xcode 9 图片描述

Xcode 8 图片描述

如你在Xcode 9图片中所见,你有自定义的导航栏,但默认的导航栏没有被隐藏。很可能是Xcode 9的一个bug,我也无法通过Storyboard来隐藏它。

这似乎是Xcode 9的一个bug,已经向苹果公司提交了错误报告。


1
是的,我只在xCode 9和iOS11中看到了这个问题。它也隐藏了默认的导航栏并添加了一个自定义的导航栏,但问题是高度没有改变为新的高度。 - Mina
2
谢谢你的帮助,至少我知道它可以绘制自定义的内容。 - Mina
那么这确实是Xcode 9的一个bug。在Xcode 8.3中,导航栏显示正常。 - Faisal
2
我已经提交了一个关于这个问题的错误报告。 - Faisal
2
我也已经报告了这个问题。这个漏洞在xCode Golden master版本中仍然存在。 - Mina
显示剩余13条评论

2
我能做到的唯一方法是删除当前的自定义导航栏,并将嵌入式UINavigationController应用于UIViewController。编辑器->嵌入式->导航控制器。
在新创建的导航控制器属性中,在实用程序(右侧栏)菜单“模拟指标”中必须指定“顶部栏”属性。在我的情况下,我需要值:“不透明导航栏”。
我还在我的UIViewController上设置了相同值的“顶部栏”,只是为了确保。
通过这样做,您将获得一个新的“导航项”,并且可以重新添加您的Bar按钮项。
这是我在等待Xcode 9更新修复它时所能做到的最好的。

“Simulated Metrics” 只在 IDE 中工作,而不在构建的应用程序中工作,是吗? - SoftDesigner
准确地说,只是为了对将要显示的内容有一个概念。 - Marco Nascimento

1

我仍然没有找到如何以像素为单位更改其大小。但是可以创建双倍导航栏大小(XCode 10.1):

    self.navigationController?.navigationBar.prefersLargeTitles = true

结果:

enter image description here


1

0

这个答案对我很有帮助。

navigationController.navigationBar.setTitleVerticalPositionAdjustment(CGFloat(10),
forBarMetrics: UIBarMetrics.Default)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接