iOS 7 | 导航栏/工具栏button非常接近状态栏

将导航栏或工具栏(情节提要)拖到我的视图控制器时出现问题。

UINavigationBar的:

UINavigationBar的

正如你在上面的图片中看到的,右边的button几乎与状态栏重叠。

用UIToolbar它发生的是一样的:

UIToolbar

这个视图控制器是用来作为模态,这就是我没有使用UINavigationController的原因。

在另一节中,我使用了一个UINavigationController,它看起来如我所料:

UINavigationController的

如何将UINavigationBar / UIToolbar拖动到视图控制器而不重叠状态栏?

导航栏或工具栏必须位于(0, viewController.topLayoutGuide.length ), viewController.topLayoutGuide.length栏位置。 您应该将导航栏或工具栏的UIBarPositionTopAttached为您的视图控制器,并返回UIBarPositionTopAttached 。 如果位置正确,则会在第三张图像中显示结果。

更多信息在这里: https : //developer.apple.com/documentation/uikit/uibarpositioningdelegate?language=objc

做这些步骤

将NavigationBar拖到Xib中的ViewController中,将ViewController设置为其委托。 请注意NavigationBar应该在(0,20)

在ViewController中,符合UINavigationBarDelegate

 @interface ETPViewController () <UINavigationBarDelegate> 

实现这个方法

 - (UIBarPosition)positionForBar:(id <UIBarPositioning>)bar { return UIBarPositionTopAttached; } 

positionForBar告诉NavigationBar是否应该向上延伸其状态栏

请在这里看到我的答案,我已经复制下面的内容方便:

https://stackoverflow.com/a/18912291/1162959

我发现的最简单的解决方法是在导航控制器中包装要呈现的视图控制器,然后呈现该导航控制器。

 MyViewController *vc = [MyViewController new]; UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:vc]; [self presentViewController:nav animated:YES completion:NULL]; 

优点:

  • 不需要使用框架。
  • 相同的代码适用于iOS 6和iOS 7。
  • 比其他解决方法更难看。

缺点:

  • 你可能会想让你的XIB空导航条或工具栏,并以编程方式将UIBarButtonItems添加到导航栏。 幸运的是,这很容易。

按照本技术说明 (防止状态栏覆盖视图),可以使用自动布局来解决此问题。

以下是一些摘录:

将垂直空间约束添加到最顶层的视图

  • 控制从UIToolbar拖到“顶部布局指南”
  • 在popover中,select“Vertical Spacing”
  • 将“垂直空间约束”常量更改为0(零)

如果在UIToolbar下面有其他子视图,请将这些视图锚定到工具栏,而不是“顶部布局指南”

这将支持ios6和ios7。

您还可以通过为ios版本提供尺寸为620×128的图像来增加导航栏的高度来pipe理它。 这个图像用于:

 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)?YES:NO) { [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"newImage.png"] forBarMetrics:UIBarMetricsDefault]; }else{ [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"previousImage.png"] forBarMetrics:UIBarMetricsDefault]; } 

我放弃了,不得不将设置导航栏高度限制为64 x xib为基础的VC原因viewController.topLayoutGuide.length为0 viewDidLoad尽pipe状态栏存在: – [这意味着在一个非通用的应用程序在iPad上,你会有20像素在视图的顶部浪费了(原因是状态栏与iphone模拟窗口是分开的)