如何在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;