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

Posted

技术标签:

【中文标题】如何在 iOS 7.1 中隐藏状态栏?【英文标题】:How can I hide the status bar in iOS 7.1? 【发布时间】:2014-04-14 03:02:41 【问题描述】:

ios 7.0 中,我通过添加隐藏了应用中的状态栏

<key>UIStatusBarHidden</key>
<true/>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>

到 info.plist。我刚刚将我的测试 iPad 更新到 iOS 7.1,状态栏现在又回到了我所有的应用程序中。如何在 7.0 和 7.1 中隐藏它?

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

【问题讨论】:

我开始认为这是 iOS 7.1 中的一个错误,我只能等待 Apple 修复它。 我向 Apple 提交了错误报告。如果有人在解决此问题之前找到了解决方法(假设他们这样做了),请在此处发布。 有什么消息吗?任何解决方案或解决方法? 我收到了来自 Apple 的确认电子邮件,但仅此而已。希望它会在 7.1.1 中得到修复。 对此有任何解决方案吗?刚刚也遇到了这个问题... 【参考方案1】:

在想要隐藏状态栏的视图控制器中,添加以下方法

- (BOOL)preferStatusBarHidden 
  return YES;

然后就可以调用了

[self setNeedsStatusBarAppearanceUpdate];

这将触发对状态栏的更改。此调用可以在动画块内完成,该动画块将为更改设置动画。

【讨论】:

我在主视图控制器中尝试了这个,但状态栏仍然出现。 有什么解决办法吗?我看到了同样的问题。我已经在这里和 Apple 论坛(那里不多)上尝试了所有“解决方案”,但它们什么也没做。更糟糕的是,状态栏出现在其他所有内容的顶部,因此它有效地掩盖了您在屏幕顶部放置的任何其他内容。我终于确信这是一个 iOS 错误,尽管我通常很难得出这个结论。【参考方案2】:

尝试添加以下内容

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

    

    - (void)viewWillDisappear:(BOOL)animated

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

【讨论】:

我尝试将它们添加到我的主视图控制器中。还是没有运气。【参考方案3】:

我可以在模拟器中以 iPhone 兼容模式运行单视图 iPhone 应用程序来重现该问题。但仅当在 iOS 7.1 上选择 iPad 非视网膜时。

我的发现:

无论您在 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

【讨论】:

我能想出的唯一解决方法是使用 UIDeviceHardware 之类的东西来确定设备类型(请参阅gist.github.com/Jaybles/1323251),然后对于非视网膜 iPad,将您的 GUI 向下移动,以便为状态栏留出空间. 我也可以用 Ipad 视网膜重现该问题。状态栏在顶部变小了【参考方案4】:

将此添加到 ViewDidLoad:

 [[UIApplication sharedApplication] setStatusBarHidden:YES
                                        withAnimation:UIStatusBarAnimationFade];

并实现以下方法:

- (BOOL)prefersStatusBarHidden 
return YES;
 

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

【讨论】:

那我建议你让你的应用通用,而不是在ipad上运行iphone App。 这有助于摆脱状态栏,但搞砸了 UI。可以浏览应用程序并调整和测试所有 UI 元素,但我无法说服客户在应用程序生命周期的后期这样做是值得的。不过感谢您的建议。 哦,太好了,您的问题得到了解决,您能够说服您的客户 :-) 如果您发现我提供的信息对解决和找出您的问题有点帮助,那么请接受并投票我的回答,所以它可能对其他人有帮助,我们将不胜感激。谢谢欢呼:-) 我的问题和布赖恩一模一样。必须有一种方法可以关闭 iphone 和 ipad 的状态栏,而不必将其设置为通用并为 ipad 重新创建故事板。【参考方案5】:

我找到的唯一解决方案是添加以下内容:

- (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.

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

【讨论】:

以上是关于如何在 iOS 7.1 中隐藏状态栏?的主要内容,如果未能解决你的问题,请参考以下文章

在iOS 7中隐藏导航栏时,如何更改状态栏的颜色?

iOS7如何隐藏状态栏?

如何在 iOS 7 中隐藏带有动画的状态栏?

如何在Swift iOS应用程序中隐藏状态栏?

如何在 iOS 7 和 iOS 6 中出现动画启动画面期间隐藏状态栏?

如何在 Swift iOS 应用程序中隐藏状态栏?