如何在 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 中隐藏状态栏?的主要内容,如果未能解决你的问题,请参考以下文章