状态栏不会消失

113

我正在创建一个应用程序,想要隐藏状态栏。 当我测试该应用程序时,在显示启动画面时状态栏已被隐藏,但是一旦应用程序完全加载,状态栏就会重新出现。

我正在使用Xcode 5和iOS 7,并尝试通过编程方式禁用状态栏。

  ([[UIApplication sharedApplication] setStatusBarHidden:YES    
      withAnimation:UIStatusBarAnimationFade];),

在 info.plist 文件中和在 .xib 文件上使用属性检查器,但似乎都没有作用。

有任何想法吗?

14个回答

220

尝试将以下方法添加到您的应用程序根视图控制器中:

- (BOOL)prefersStatusBarHidden
{
    return YES;
}

2
如何在全局范围内实现这个? - jjxtra
16
根据苹果文档,如果您调用了此方法并使用了除默认值(默认值为NO)以外的其他值,则应该调用[self setNeedsStatusBarAppearanceUpdate]; - manderson
3
@PsychoDad,请检查我的答案是否有更全局的解决方案。 - Idan
2
太好了,谢谢。我只是想不通为什么iOS 7会这样做,而不尊重不包含状态栏设置的XIB! - justinhartman
1
在堆栈中添加到 ViewController 上的这个代码片段就足以隐藏该 ViewController 中的状态栏;当该 ViewController 被移除时,状态栏会重新显示。 - MacD
显示剩余3条评论

125
你应该将此值添加到plist中: "视图控制器为基础的状态栏外观",并将其设置为"NO"。
这将使您能够将状态栏设置为隐藏模式。 这将将其设置为全局,不像其他提供的答案。 更新: 如果您希望启动画面时状态栏被隐藏,请不要忘记在目标状态栏选项中标记"应用程序启动时隐藏"。 此外,如果您不想在应用程序内部使用代码来实现,您可以将"初始状态栏是否隐藏"添加到plist中,并将其设置为""。

2
我花了很多时间才弄清楚这个问题。我认为每个人都会遇到这个问题,而苹果公司并没有充分提及它。很高兴能够帮助... - Idan
7
运行良好,请不要忘记将 "Status bar is initially hidden" 的 .plist 值设置为 YES。 - andreas-supersmart
1
哇,这是唯一在Kobold2d 2.1.0和iOS 7上有效的方法,非常感谢! - Binarian
5
苹果并不真正支持向后兼容性。让我们跟随他们的节奏,更新我们每一个应用程序。抱歉,发泄一下沮丧感情。这是由苹果引起的。 - Henrik Erlandsson
1
这是正确的答案...因为我想要时不时地显示和隐藏状态栏,而"prefersStatusBarHidden"方法是永久性的。 - user2387149
显示剩余8条评论

73

您发布的代码适用于iOS 6.1及以下版本。对于iOS 7,苹果已经提供了新的方法来直接控制每个视图的状态栏。在您的Info.plist中关闭此选项将使您能够隐藏状态栏,至少在当前的开发者预览版(4)中是这样的。

添加此并设置为NO

有关参考,请查看苹果开发者门户网站上可用的iOS 7过渡指南。


3
我认为这个答案更好,因为在我的应用程序中,我只想在横屏模式下隐藏状态栏,谢谢! - Son Nguyen
谢谢,这对我很有帮助,因为我想在整个应用程序中隐藏它。 - kevinl
2
在我看来,这个答案应该是最好的答案 -> 在这里有解释 https://developer.apple.com/library/prerelease/ios/documentation/UserExperience/Conceptual/TransitionGuide/Bars.html#//apple_ref/doc/uid/TP40013174-CH8-SW1 - marceloquinta
5
我已经这样做了,但似乎只隐藏了状态栏,我的应用程序仍然被推下了状态栏的高度,而且我仍然能看到电池指示器! - vedran

35

我试图在所有我的应用中隐藏状态栏,并在“app” -info.plist文件中添加两行到字典“信息属性列表”。我添加了“View controller-based status bar appearance”的设置为NO以及“Status bar is initially hidden”的设置为YES。对我来说,它起作用了 n_n'

plist info


2
这将强制您的应用程序进入兼容模式,该模式专为在iOS 7上运行旧应用程序而设计,当开发人员没有时间修复应用程序以适应新的操作方式时。相反,您需要在视图控制器中实现prefer*方法。 - lhunath

17

然而,如果你使用UIImagePicker,状态栏会重新出现。

在这种情况下,你应该像下面这样隐藏状态栏,

- (void)imagePickerController:(UIImagePickerController *)aPicker didFinishPickingMediaWithInfo:(NSDictionary *)info {

// for iOS7
    if ([self respondsToSelector:@selector(setNeedsStatusBarAppearanceUpdate)]) {

        [[UIApplication sharedApplication] setStatusBarHidden:YES];
    }

2
我遇到了同样的问题。状态栏在使用UIImagePicker之前是隐藏的。我尝试了你的解决方案,但对我没有起作用。除了你发布的代码,我需要添加其他内容吗? - Dev01
@WootWoot 我也在视图控制器中添加了 - (BOOL)prefersStatusBarHidden { return YES; }。请尝试一下。 - alones
似乎对我不起作用...你应该实际调用 setNeedsStatusBarAppearanceUpdate 吗? - RyanM
我需要在按钮点击时隐藏状态栏。我已经尝试了下面的代码,但它没有起作用。有人可以帮帮我吗?[[UIApplication sharedApplication] setStatusBarHidden:YES]; - janitheshan

7

要在特定的UIViewController上隐藏状态栏,只需添加以下内容:

-(BOOL)prefersStatusBarHidden
{
    return YES;
}

希望这能有所帮助!

这是我在iOS 9.2中使用的解决方案,修改plist没有任何效果。 - mico

7
经过长时间的搜索,我终于找到了一个非常简单的解决方案,它还可以处理UIImagePickerController问题。
如其他答案所述,在AppDelegate的didFinishLaunching中设置隐藏状态栏,并将“基于视图控制器的状态栏外观”设置为NO。
然后,在您的AppDelegate中:
- (void)application:(UIApplication *)application didChangeStatusBarFrame:(CGRect)oldStatusBarFrame
{
      [application setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];
}

而且 - 当UIImagePickerController被置于前台时,您的状态栏将保持隐藏。

这比每次显示UIImagePickerController时都“重新隐藏”它更好,因为它在整个应用程序中保持隐藏状态。


2
尽管在iPad上的iOS7中仍然存在一些问题 - UIImagePickerController第二次显示时仍会弹出状态栏... 呜呜呜... :-( 目前我正在使用appDelegate以及在每个viewWillAppear中再次隐藏它。因此,即使它看起来有点不好看,但问题很快就会得到解决。 - ikuramedia
1
这是我在iOS8上唯一有效的方法...某种程度上,prefersStatusBarHidden在我的视图控制器上没有被调用。 - mojuba

5
您可以隐藏项目摘要。在启动期间有一个复选框可以选择隐藏。
请参见快照。 enter image description here

4

我找到了适合我的解决方案,它非常实用。将以下代码写在你希望使用UIImagePickerController的视图控制器中。

- (void)viewWillDisappear:(BOOL)animated
{
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];
}
- (void)viewWillAppear:(BOOL)animated
{
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];
     }

3

除了上面alones的答案外,还要确保实现imagePickerControllerDidCancel方法,并在那里添加相同的代码。


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