如何在iOS 7.1中隐藏状态栏?

15
在iOS 7.0中,我通过添加代码来隐藏我的应用程序中的状态栏。
<key>UIStatusBarHidden</key>
<true/>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>

将信息.plist文件中的“View controller-based status bar appearance”键设置为“NO”,即可在iOS 7.0和7.1中隐藏状态栏。

更新:这只发生在iPad上运行的iPhone应用程序中,在iPhone或模拟器中我没有看到这个问题。


我开始认为这是iOS 7.1中的一个错误,我只能等待苹果公司修复它。 - Brian
我向苹果提交了一个错误报告。如果在他们修复这个问题之前有人找到了解决方法(假设他们会这样做),请在这里发布。 - Brian
有关这个的任何消息吗?有什么解决方案或变通方法吗? - AmineG
我收到了一封来自苹果的确认电子邮件,但仅此而已。希望在7.1.1中能够修复这个问题。 - Brian
有解决方案了吗?我也刚遇到这个问题... - user2431285
@user2431285 我还没有听说过类似的情况,不过我已经没有iPad来测试了。iOS 8.0应该很快就会发布,希望在那里能够得到修复。 - Brian
5个回答

1
我可以在模拟器中运行一个单视图 iPhone-only 应用程序并在 iPad 非 retina 上的 iOS 7.1 中复现问题。但只有在选择 iPad 非 retina 上才会出现问题。
我的发现:
- 不管你在 plist 或代码中指定了什么,状态栏都不会被隐藏。 - 在 retina iPad 上不会出现这个问题。 - 在 iOS 7 或 iOS 6 上不会出现这个问题。
我在 .plist 文件中尝试了以下键:
<key>UIStatusBarHidden</key>
<true/>
<key>UIStatusBarHidden~ipad</key>
<true/>

并且

<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>UIViewControllerBasedStatusBarAppearance~ipad</key>
<false/>

我也尝试了由@Irfan提出的基于ViewController的解决方案,但没有成功。
似乎也无法检测状态栏是否显示,因为[UIApplication sharedApplication].statusBarFrame返回{0, 0, 0, 0}。

1
我唯一想到的解决方法是使用类似UIDeviceHardware(请参见https://gist.github.com/Jaybles/1323251)的东西来确定设备类型,然后对于非视网膜iPad将GUI向下移动以留出状态栏的空间。 - Morris
我也可以用iPad Retina重现这个问题。状态栏只是在顶部更小了一些。 - vboombatz

1
在您想要隐藏状态栏的视图控制器中,添加以下方法。
- (BOOL)preferStatusBarHidden {
  return YES;
}

然后你可以调用

[self setNeedsStatusBarAppearanceUpdate];

这将触发对状态栏的更改。此调用可以在动画块内完成,以实现更改的动画效果。


我在我的主视图控制器中尝试了这个方法,但状态栏仍然出现。 - Brian
有什么解决办法吗?我也遇到了同样的问题。我已经尝试了这里和苹果论坛上的所有“解决方案”,但都没有用。更糟糕的是,状态栏出现在所有其他内容的顶部,因此它实际上会遮挡您放置在屏幕顶部的任何其他内容。我终于相信这是iOS的一个bug,尽管我通常很慢才能得出这个结论。 - RobertL

1
尝试添加以下内容:

   - (void)viewWillAppear:(BOOL)animated{
        NSLog(@"View will appear");
        [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];

    }

    - (void)viewWillDisappear:(BOOL)animated{

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

我尝试将它们添加到我的主视图控制器中,但仍然没有成功。 - Brian

0
我找到的唯一解决方案是添加以下内容:
- (UIStatusBarStyle) preferredStatusBarStyle {
    return -1;
}

无论你在哪里:

- (BOOL)prefersStatusBarHidden {
    return YES;
}

这显然很糟糕,但对我来说似乎可以工作 - 至少到目前为止。

更新:我注意到这会导致以下输出:

<Error>: CGContextRestoreGState: invalid context 0x0. This is a serious error. This application, or a library it uses, is using an invalid context  and is thereby contributing to an overall degradation of system stability and reliability. This notice is a courtesy: please fix this problem. It will become a fatal error in an upcoming update.

我找到了另一种解决方法,而且这个错误可能是让这个解决方法起作用的原因,所以我会坚持使用它,但值得注意。


0
在 ViewDidLoad 中添加以下代码:
 [[UIApplication sharedApplication] setStatusBarHidden:YES
                                        withAnimation:UIStatusBarAnimationFade];

并实现以下方法:

- (BOOL)prefersStatusBarHidden {
return YES;
 }

它将隐藏您实现它的特定ViewController的状态栏。 对我来说,它的效果非常好。 希望它也能帮助到你。


1
我建议您将应用程序制作成通用型,而不是在iPad上运行iPhone应用程序。 - Irfan
那个方法虽然成功去掉了状态栏,但同时也破坏了用户界面。虽然可以逐个调整和测试所有的用户界面元素,但在应用程序生命周期末期,我不可能说服客户这样做是值得的。还是感谢您的建议。 - Brian
哦,太好了,你的问题解决了,你能说服你的客户 :-) 如果你发现我提供的信息在解决和找出你的问题方面有一点帮助,请接受并赞成我的答案,这可能对其他人有所帮助,并且会受到高度赞赏。谢谢,干杯 :-) - Irfan
1
我和Brian有完全相同的问题。必须有一种方法可以关闭iPhone和iPad的状态栏,而无需将其设置为通用并重新创建iPad的故事板。 - vboombatz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接