setStatusBarHidden:否之后XIB负载覆盖UINavigationBar的

问题描述:

setStatusBarHidden:NO设置之前视图负载,UINavigationBar和其他元素立即出现状态条下方对齐,他们应该。但是,当setStatusBarHidden:NO设置为视图加载,UINavigationBar部分覆盖。setStatusBarHidden:否之后XIB负载覆盖UINavigationBar的

加载所述视图后必须显示StatusBar,但如何在不遇到上述问题的情况下完成此操作?

+0

我很想知道这个问题的答案为好。 – 2011-06-24 17:48:05

我在我的代码中发现了一个黑客,虽然不记得或找到它来自哪里。诀窍是通过隐藏和reshowing以刷新导航栏:

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

在我的代码的功能如下:

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 

    [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone]; 

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

然而,被警告,这是一个黑客,目前我正在努力解决一些似乎源于此代码的错误(导航条目与导航内容不匹配)。但是因为它在某些地方对我有用,所以我想我会提及它。

编辑: 我想我找到了最初的帖子在这里: How do I get the navigation bar in a UINavigationController to update its position when the status bar is hidden?

GL, 俄德

+0

这用于工作,但它看起来像不在iOS 5上。:( – davehayden 2012-01-30 22:27:24

我的猜测是导航栏在状态栏显示之前加载,因此导航栏的位置是(0,0),然后与(0,0)处的状态栏重叠。在致电setStatusBarHidden:NO后,您可以移动导航栏的框架(或设置动画块)viewDidLoad。 尝试做navigationBar.frame = CGRectMake(0,20,320,44); 状态栏是320x20,所以只需将导航栏向下移动20就应该适应它。

下面是我在做什么在我的根控制器现在在iOS 5中,我告诉后状态栏动画英寸丑,但它似乎工作。

CGRect rect; 

if (self.interfaceOrientation == UIInterfaceOrientationPortrait) 
    rect = CGRectMake(0, 20, 320, 460); 
else if (self.interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) 
    rect = CGRectMake(0, 0, 320, 460); 
else if (self.interfaceOrientation == UIInterfaceOrientationLandscapeLeft) 
    rect = CGRectMake(20, 0, 300, 480); 
else 
    rect = CGRectMake(0, 0, 300, 480); 

[UIView animateWithDuration:0.35 animations:^{ self.view.frame = rect; }]; 

(我知道这是一个老问题,但我只花了一个半小时试图找到自己的答案没有成功,所以我想我会在这里发布了其他人谁卡住...特别是如果你想显示状态栏,你的观点是结束了重叠的话)

我发现这个作品,如果你想隐藏状态栏...

[[UIApplication sharedApplication] setStatusBarHidden:YES]; 
[self.view setFrame: [[UIScreen mainScreen] bounds]]; 

但不是当你想显示状态栏... 在这种情况下我使用这个解决方案wh ich工作,但我很担心,因为它将状态栏高度硬编码为20 ... 它也担心我必须根据方向以不同的方式调整视图。但如果我没有这样做,它总是在错误的边缘上留下20分的差距。 在我的情况下,我想关闭一些视图的状态栏,然后返回时返回。如果我在酒吧关闭时旋转了设备,我遇到了特殊的问题。所以switch语句尽管很丑陋(有人可能会发布一个更干净的解决方案),但它的作用。

[[UIApplication sharedApplication] setStatusBarHidden:NO]; 

CGRect frame = [[UIScreen mainScreen] bounds]; 

switch (self.interfaceOrientation) 
{ 
    case UIInterfaceOrientationPortrait: 
     frame.origin.y = 20; 
     frame.size.height -= 20; 
     break; 

    case UIInterfaceOrientationPortraitUpsideDown: 
     frame.origin.y = 0; 
     frame.size.height -= 20; 
     break; 

    case UIInterfaceOrientationLandscapeLeft: 
     frame.origin.x = 20; 
     frame.size.width -= 20; 
     break; 

    case UIInterfaceOrientationLandscapeRight: 
     frame.origin.x = 0; 
     frame.size.width -= 20; 
     break; 

} 

[self.view setFrame:frame]; 

如果你是因为你不显示状态栏,而你Default.png加载,然后想在观看你的第一个视图控制器立即显示在状态栏有这个问题,只要确保你之前把[[UIApplication sharedApplication] setStatusBarHidden:NO];[self.window makeKeyAndVisible];在您的AppDelegate.m。它发生得非常快,你永远不会看到启动画面上的状态栏。

[[UIApplication sharedApplication] setStatusBarHidden:NO]; 
[self.window makeKeyAndVisible]; 
+0

这适用于我,只需确保在AppDelegate中的[self.window makeKeyAndVisiable]之前插入set statusBarHidden:withAnimation:方法即可。 – 2013-03-06 07:08:14

在搭载iOS 7,您可以使用:

setNeedsStatusBarAppearanceUpdate 

例如:

[self.mainViewController.navigationController setNeedsStatusBarAppearanceUpdate]; 

苹果文档:

调用此方法如果视图控制器的状态栏属性,如 为隐藏/未隐藏状态o风格,变化。如果您在动画块内调用此方法 ,则动画块的其余部分将与动画一起动画。

仅使用它的iOS 7