IOS7中的UINavigationBar /状态栏问题

Stu*_*rtM 47 uinavigationbar uinavigationcontroller uistatusbar ios7

最终编辑

(如果需要编辑进行最终编辑,请参阅其他编辑,而不是编写过长的问题).

控制器设置

我有一个应用程序设置如下:

InitialViewController(子类ECSlidingViewController)

主导航控制器(子类UINavigationController)

主要家庭视图控制器(子类UIViewController)


在viewDidLoadinitialViewController中,我以主视图控制器为根加载主导航控制器.

self.topViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"MainNavVC"];
Run Code Online (Sandbox Code Playgroud)

问题

在应用程序的第一次加载时,状态栏和导航栏是分开的. 在此输入图像描述

这是期望的效果.

但是,然后我使用标准方法加载模态视图控制器并关闭它:

[self performSegueWithIdentifier:@"LoadSelectOpponentVC" sender:self];
Run Code Online (Sandbox Code Playgroud)

然后关闭:

[self dismissViewControllerAnimated:YES completion:nil];
Run Code Online (Sandbox Code Playgroud)

这反过来导致主导航控制器(保持主视图控制器)错误地显示状态栏并重叠:

在此输入图像描述

测试

  1. plist设置为YES - View controller-based status bar appearance
  2. 我已经尝试设置edgesForExtendedLayout相关的无,但没有改变.

记录

我试图注销一些框架以查看问题发生的位置:

在第一次加载时:

主Nav VC - 查看框架 - {{0,0},{320,480}}

Main Nav VC - Nav Bar Frame - {{0, 0}, {320, 44}}

Initial VC - View Frame - {{0, 0}, {320, 480}}

Home VC - View Frame - {{0, 0}, {320, 480}} -- viewDidLoad Home VC

Home VC - View Frame - {{0, 64}, {320, 416}} -- viewWillAppear Home VC

--- After Modal is opened/closed ----

Home VC - View Frame - {{0, 64}, {320, 416}} -- viewWillAppear Home VC

Main Nav VC - View Frame - {{0, 0}, {320, 480}} -- viewWillAppear Main Nav

Main Nav VC - Nav Bar Frame - {{0, 20}, {320, 44}} -- viewWillAppear Main Nav

Home VC - View Frame - {{0, 44}, {320, 436}} -- viewDidAppear Home VC
Run Code Online (Sandbox Code Playgroud)

Nic*_*uet 39

您是否尝试过Apple关于"防止状态栏覆盖您的观点"的建议:https://developer.apple.com/library/content/qa/qa1797/_index.html

您是否看过"UIBarPositioningDelegate":https://developer.apple.com/documentation/uikit/uibarpositioningdelegate

  • 这个引用说'使用不透明UINavigationController或UITabBarController的应用程序会自动将其内容保留在状态栏下方.但是我的例子/问题显然不是这样.我也尝试将酒吧定位设置为顶部和顶部,但无济于事. (8认同)
  • UIBarPositioningDelegate像一个魅力!只需将您的视图控制器设置为UIBarPositioningDelegate并将其指定为栏的委托.然后将此方法添加到视图控制器(仅在iOS7 +中可用): - (UIBarPosition)positionForBar:(id <UIBarPositioning>)bar {return UIBarPositionTopAttached; } (3认同)

Sun*_*aru 26

在iOS 7.0中UIViewController默认以这种方式工作.如果您在内部使用UIViewController UINavigationController并且navigationBar可见,则视图将全屏显示.

如果navigationBar可见,请执行以下操作.==>

self.edgesForExtendedLayout = UIRectEdgeNone
Run Code Online (Sandbox Code Playgroud)

如果hiddenBar被隐藏,请执行以下操作.==>

UIView通过移动20个点来调整所有元素

如果使用"界面"构建器,则可以使用iOS6/7增量:首先,"查看为iOS 6.0",然后设置增量"20"以在iOS 7中实现+20偏移


jbc*_*man 18

我很惊讶没有人找到正确的答案.UIBarPositioningDelegate就像一个魅力!只需将您的视图控制器设置为UIBarPositioningDelegate并将其指定为栏的委托.将条形图从视图顶部放置20个像素.然后将此方法添加到视图控制器(仅适用于iOS7 +):

- (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar 
{ 
   return UIBarPositionTopAttached; 
}
Run Code Online (Sandbox Code Playgroud)

  • 将自定义导航栏添加到UIViewController时,此解决方案可以正常工作.对于UINavigationController,您需要创建UINavigationController的子类,并将该子类定义为UINavigationBarDelegate(符合UIBarPositioningDelegate),类似于:http://stackoverflow.com/a/7453933/485895.只需添加我的答案中提到的positionForBar:方法即可解决问题,但您可以看到这个子类方法也为您提供了其他机会. (4认同)

jar*_*air 1

我在类似问题的回答中详细回答了这个问题。简短的回答是:没有办法获得您在 iOS 6 及更早版本中习惯的自动状态栏布局行为。您必须围绕它进行设计,或者找到一种模拟旧样式的方法(我介绍了这两种方法)。

我强烈建议您不要对导航栏框架进行手动调整。让 UINavigationController 自己处理。最有可能的是,您的问题是导航控制器的视图框架不等于 UIScreen 的边界。