如何在iOS 11中正确设置UINavigationBar高度

在我的iOS 9+应用程序中,我使用UINavigationBar在一些UIViewController “手动”(=直接将它们放在VC中,而不是使用UINavigationViewController )。

使用简单的UINavigationBar为这样的UINavigationBar设置高度是没有问题的。 然而,在iOS 11中,条本身仍然正确地使用分配的大小,但是内容不再正确定位(现在被分配到顶部)。

在这里输入图像说明

任何想法如何解决这个问题?

编辑:

我很确定,这不是“ 自定义iOS 11导航栏高度自定义 ”的重复,这个问题解决了UINavigationBar子类的问题,而我直接使用UINavigationBar 。 另外,所描述的问题似乎从Beta 4开始就解决了,而我在Beta 6中遇到了这个问题。

编辑2:

同时,我在另一个线程中实现了CharlieSu提出的UINavigationBar子类。 但是这并没有解决我的问题。 看来,子视图框架都设置正确(没有手动这样做),但布局是打破了反正。 所以手动设置帧没有任何区别。

我现在正面临着这个问题。 起初,酒吧似乎是另一个与我的冲突的高度限制,但我有1000个优先事项,所以它似乎不是问题。 然后我在UINavigationBar“UINavigationBarContentView”里面看到另一个视图,这个视图的高度大于0。

然后我试图设置navigationBar.clipsToBounds = true,它的工作原因,父视图有正确的高度… … –

编辑:如果你需要显示酒吧的阴影,你将需要clipToBounds =假。 在这种情况下,您可以inheritanceNavigationBar

 import UIKit class SecondNavigationBar: UINavigationBar { override func layoutSubviews() { super.layoutSubviews() for subview in self.subviews { var stringFromClass = NSStringFromClass(subview.classForCoder) print("--------- \(stringFromClass)") if stringFromClass.contains("BarBackground") { subview.frame = self.bounds } else if stringFromClass.contains("UINavigationBarContentView") { subview.frame = self.bounds } } } } 

我也有这个问题。 我这样解决了它:

  -(void)layoutSubviews{ [super layoutSubviews]; CGRect rectStatus = [[UIApplication sharedApplication] statusBarFrame]; if (rectStatus.size.height==44.f) { }else{ if (@available(iOS 11.0, *)) { for ( UIView*aView in self.subviews) { if ([NSStringFromClass(aView.classForCoder) isEqualToString:@"_UINavigationBarContentView"]) { aView.frame = CGRectMake( 0,20,aView.frame.size.width,44); } else if ([NSStringFromClass(aView.classForCoder) isEqualToString:@"_UIBarBackground"]) { aView.frame = CGRectMake(0,0,aView.frame.size.width, 64); } } } } } 

在iOS 11中,当你在UIViewController中使用自定义的UINavigationBar时,我们可以直接覆盖UINavigationBar的子类中的barPosition(返回UIBarPositionTopAttached,而不是默认值UIBarPositionTop)
喜欢这个 :

 - (UIBarPosition)barPosition { return UIBarPositionTopAttached; } 

布局代码将如下所示:

  NSLayoutConstraint* a = [navigationBar.widthAnchor constraintEqualToAnchor:viewController.view.widthAnchor]; NSLayoutConstraint *b = [navigationBar.centerXAnchor constraintEqualToAnchor:viewController.view.centerXAnchor constant:0]; NSLayoutConstraint* c = [navigationBar.centerYAnchor constraintEqualToAnchor:viewController.view.topAnchor constant:X]; [NSLayoutConstraint activateConstraints:@[a,b,c]]; 

不要设置它的高度,它应该始终是44。

它在iOS 11中运行良好。视图层次结构与UINavigationController相同。
但它不能在iOS 11下工作。我们需要设置UINavigationBarDelegate以返回UIBarPositionTopAttached in

 - (UIBarPosition)positionForBar:(id <UIBarPositioning>)bar;