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
- plist设置设置为YES –
View controller-based status bar appearance
- 我已经尝试设置
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);