iOS7中的UINavigationBar /状态栏问题

最终编辑

(而不是有一个太长的问题编辑作出澄清最终编辑,请参阅其他编辑如果需要)。

控制器设置

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

InitialViewController(ECSlidingViewController的子类)

主导航控制器( UINavigationController子类)

主视图控制器( UIViewController子类)


在initialViewController的viewDidLoad中,我将主控制器加载到Home View Controller中作为它的根。

 self.topViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"MainNavVC"]; 

问题

在应用程序的第一次加载时,状态栏和导航栏是分开的。 在这里输入图像说明

这是预期的效果。

然而,我然后加载一个模式视图控制器,并closures它,使用标准的方法:

 [self performSegueWithIdentifier:@"LoadSelectOpponentVC" sender:self]; 

然后closures:

 [self dismissViewControllerAnimated:YES completion:nil]; 

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

在这里输入图像说明

testing

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

logging

我试图注销一些框架,以查看问题发生的地方:

第一次加载:

主导航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 

你有没有尝试苹果的build议“防止状态栏覆盖你的意见”: https : //developer.apple.com/library/content/qa/qa1797/_index.html

你有没有看看“UIBarPositioningDelegate”: https : //developer.apple.com/documentation/uikit/uibarpositioningdelegate

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

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

 self.edgesForExtendedLayout = UIRectEdgeNone 

如果navigationBar被隐藏,请执行以下操作。 ==>

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

如果你使用Interface Builder,你可以使用iOS6 / 7增量:首先,“view as iOS 6.0”,然后设置一个“20”的增量,以在iOS 7中实现+20偏移量

我很惊讶没有人有正确的答案。 UIBarPositioningDelegate就像一个魅力! 只要让你的视图控制器UIBarPositioningDelegate并将其分配为酒吧的代表。 从视图的顶部放置20个像素的条。 然后将此方法添加到您的视图控制器(仅适用于iOS7 +):

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

我有一个类似的问题,“汉堡包”菜单button滑动主视图控制器,并有一个菜单视图控制器的一面。 我发现菜单视图控制器的导航栏不知道状态栏是否显示。 我通过在状态栏显示和隐藏后发布通知来修复它

 [self.navigationController setNavigationBarHidden:YES/NO animated:NO]; 

在菜单的视图控制器中。

你有没有尝试添加下面的代码到你的viewDidLoad方法中:

 if ([self respondsToSelector:@selector(edgesForExtendedLayout)]) self.edgesForExtendedLayout = UIRectEdgeNone; 

在苹果迁移到iOS 7 doumentation时很快就会解释: https : //developer.apple.com/library/ios/documentation/userexperience/conceptual/TransitionGuide/AppearanceCustomization.html

我使用这个post的答案解决了这个问题: iOS 7 | 导航栏/工具栏button非常接近状态栏

使用Autolayout你应该忽略设置一个新的框架。 您应该为TopBar for iOS 7添加等于20的Top Space Constraint。

对于类似的问题,我已经回答了这个问题。 简短的回答是这样的:你无法从iOS 6和更早的版本中获得自动状态栏布局行为。 你将不得不围绕它来devise,或者find一种方法来模拟旧式(我涵盖了两种方法)。

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

我知道你有ViewController作为主要的VC。 但是,如果有人使用UITableviewController并有相同的问题,这段代码解决了这个问题:

 self.tableView.contentInset = UIEdgeInsetsMake(20.0f, 0.0f, 0.0f, 0.0f); 

解决这个问题其实很简单。 它涉及操纵UINavigationBar的center.y值,这是UIKit原生使用的,以便将UINavigationBar调整到状态栏的高度。 为了简单起见,我将UINavigationBar分类并做了以下操作:

 @implementation MyNavigationBar - (void) setCenter:(CGPoint)center { // Anything less than or equal to 22 is something we don't want (below SB height) if(center.y > 22) [super setCenter:center]; } @end 

是的,有同样的问题。 跟着所有的步骤,但没有改变。

通过确保AutoLayout正确设置整个屏幕,而不仅仅是按照指定的顶部视图/工具栏来实现它的工作

“阻止状态栏覆盖您的视图”: https : //developer.apple.com/library/ios/qa/qa1797/_index.html

至less对于主Viewcontroller.view下的所有视图。

有一个内置的方法来做到这一点。 和Joel Cave的回答一样,但是阐述了:

使您的导航栏有20点的Y起源。

然后在.h文件中:

 @interface XYZViewController : UIViewController <UIBarPositioningDelegate> 

在.m文件中:

 - (void)viewDidLoad { [super viewDidLoad]; self.navigationBar.delegate = self; } - (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar { return UIBarPositionTopAttached; } 

对我来说,解决scheme是将导航栏移到20点 在这里输入图像说明

我对派对有点晚了,但是因为我面临同样的问题,这是search中出现的第一个结果,我想我的答案可以帮助其他人:)

我通过实施来解决这个问题

 - (BOOL)shouldAutorotate { return NO; } 

在呈现模态的视图控制器中。

试试吧,所有导航栏都应该是半透明的就是禁用了。

 [self.navigationController.navigationBar setTranslucent:NO]; 

如果您使用故事板devise了视图,则可以使用XCode解决问题。 selectNavigationBar小部件并取消选中“半透明”。

在这里输入图像说明

最好的办法是在视图中join这个问题:

 if (self.navigationController.navigationBar.frame.origin.y==0) self.navigationController.navigationBar.frame = CGRectMake(self.navigationController.navigationBar.frame.origin.x, self.navigationController.navigationBar.frame.origin.y, self.navigationController.navigationBar.frame.size.width, 64);