iOS 7 |导航栏/工具栏按钮非常靠近状态栏

时间:2013-09-19 17:55:24

标签: uinavigationbar uistoryboard uitoolbar ios7

将导航栏或工具栏(故事板)拖动到视图控制器时出现问题。

UINavigationBar的:

UINavigationBar

如上图所示,右侧按钮几乎与状态栏重叠。

使用UIToolbar它会发生相同的事情:

UIToolbar

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

在另一节我使用UINavigationController,它看起来像我期望的那样:

UINavigationController

如何在不重叠状态栏的情况下将UINavigationBar / UIToolbar拖动到视图控制器?

6 个答案:

答案 0 :(得分:48)

导航栏或工具栏必须位于(0,viewController.topLayoutGuide.length),条形定位为UIBarPositionTopAttached。您应该将导航栏或工具栏的代理设置为视图控制器,然后返回UIBarPositionTopAttached。如果定位正确,您将在第三张图片中得到结果。

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

答案 1 :(得分:25)

执行以下步骤

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

在ViewController中,符合UINavigationBarDelegate

@interface ETPViewController () <UINavigationBarDelegate>

实施此方法

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

positionForBar告诉NavigationBar它是否应该将其背景向上扩展到状态栏

答案 2 :(得分:9)

请在此处查看我的回答,为方便起见,我复制了以下内容:

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留空导航栏或工具栏,并以编程方式将UIBarButtonItem添加到导航栏。幸运的是,这很容易。

答案 3 :(得分:5)

您可以按照此techincal note使用自动布局解决此问题(防止状态栏覆盖您的视图)。

以下是一些摘录:

  

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

     
      
  • 控制从UIToolbar拖动到“顶部布局指南”
  •   
  • 在弹出框中,选择“垂直间距”
  •   
  • 将“垂直空间约束”常量更改为0(零)
  •   
     

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

这将支持ios6和ios7。

答案 4 :(得分:0)

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

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];
}

答案 5 :(得分:0)

我放弃并且必须在x xib基础上将导航栏高度约束设置为64因为尽管状态栏存在,viewController.topLayoutGuide.length在viewDidLoad中为0: - [ 这意味着在ipad上的非通用应用程序中,你的顶部有20像素 视图浪费(原因状态栏与iphone模拟窗口分开)