42

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

UI导航栏:

UI导航栏

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

使用 UIToolbar 会发生同样的情况:

UI工具栏

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

在另一部分中,我使用了 UINavigationController,它按我的预期出现:

UINavigationController

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

4

6 回答 6

48

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

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

于 2013-09-19T17:59:31.133 回答
25

执行这些步骤

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

在 ViewController 中,符合UINavigationBarDelegate

@interface ETPViewController () <UINavigationBarDelegate>

实现这个方法

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

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

于 2013-11-24T08:26:00.603 回答
10

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

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 添加到导航栏。幸运的是,这很容易。
于 2013-09-20T08:50:09.403 回答
5

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

以下是一些摘录:

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

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

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

这将支持 ios6 和 ios7。

于 2013-09-27T02:39:46.297 回答
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];
}
于 2013-09-27T12:35:57.163 回答
0

我放弃了,不得不在基于 x xib 的 VC 中将导航栏高度约束设置为 64,因为 viewController.topLayoutGuide.length 在 vi​​ewDidLoad 中为 0,尽管存在状态栏:-[ 这意味着在 ipad 上的非通用应用程序中,您将拥有 20 像素在视图的顶部浪费了(因为状态栏与 iphone 模拟窗口是分开的)

于 2016-03-17T16:31:26.863 回答