无法在iOS7中隐藏状态栏

270

我刚刚将我的iPhone 5 iOS 7升级到了第四个测试版。现在,当我从Xcode 5在这个iPhone上运行我的应用程序时,状态栏不会隐藏,尽管它应该隐藏。

无法正常工作:

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

无法工作:

[UIApplication sharedApplication].statusBarHidden = YES;

无法登录苹果开发者论坛


15
不正确,我的回答涉及到Xcode并已向公众展示。说“如果你回答这个问题就违反了NDA”太笼统了...让开发人员自己决定吧;-) - Jake
可能是状态栏不会消失的重复问题。 - ekhumoro
如何在特定的ViewController中以编程方式隐藏状态栏? - bhavik
26个回答

560

3
太棒了!我在这上面浪费了好几个小时!谢谢你! - Idan
12
参考:实际 Info.plist 文件中存储的原始值称为 UIViewControllerBasedStatusBarAppearance。 翻译:在 Info.plist 文件中,存储的原始数值被称为“UIViewControllerBasedStatusBarAppearance”。 - Adam Rosenfield
55
这种方法的唯一问题是,如果您使用UIImagePickerController选择图像,它将再次强制显示状态栏。确保避免这种情况的唯一可靠方法是在每个视图控制器中实现prefersStatusBarHidden方法并重置UIViewControllerBasedStatusBarAppearance plist设置为true。 - Jason Fuerstenberg
5
我不知道为什么苹果要改变这个!谢谢 :) - Mohamed Amine
19
您还需要将“状态栏最初是否隐藏”设置为 - Zorayr
显示剩余2条评论

278

在您的视图控制器中添加方法。

- (BOOL)prefersStatusBarHidden {
    return YES;
}

35
对于那些寻找方法,在特定视图中动态移除状态栏,这就是正确的做法。无论您在 plist 中设置了什么“View controller-based status bar appearance”,此方法都适用! - Mr. T
2
+1 是因为我正在寻找动态显示/隐藏状态栏的能力。然而,P-list设置方法(请参见@Satgi上面的帖子)是全局显示/隐藏状态栏的最佳方法。 - JonnyB
这应该是正确的答案,因为它解决了UIImagePickerController的错误。 - d370urn3ur
4
在iOS 8中,情况似乎不再如此。如果您将基于视图控制器的状态栏外观设置为“否”,并且在一个视图控制器中从prefersStatusBarHidden返回true,则不起作用。状态栏仍然会出现。 - Isuru
1
@Isuru,你为什么设置为NO?如果你设置为YES,它会询问每个视图控制器,否则当然不会。 - invoodoo
显示剩余5条评论

85
在Plist中添加以下属性:

-> Status bar is initially hidden = YES

-> View controller-based status bar appearance = NO

同时添加-现在状态栏将消失。

是的,这对我也起作用了。如果不将“状态栏最初隐藏”选项设置为“是”,它就无法按预期工作。谢谢。 - AndrewShmig

54

要在单个视图中隐藏状态栏,您应该使用以下代码:

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

一开始,这对我没有起作用,后来我在方法文档中看到了这样的说明: // 如果您的应用程序正在使用默认的基于UIViewController的状态栏系统,则设置statusBarHidden无效。

这需要在plist文件中完成,将键View controller-based status bar appearance添加到NO。 然后它就可以工作了。


16

要在iOS7中隐藏状态栏,您需要2行代码

  1. 在应用程序:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions中编写以下内容:

[application setStatusBarHidden:YES];
  • 在info.plist中添加以下内容

  • View-Controller Based Status Bar Appearance = NO
    

    2
    只是为了清理一下,如果你把这个放在didFinishLaunching里面,你可以直接写 [application setStatusBarHidden:YES]; 或者 application.statusBarHidden = YES; - joel.d
    “View-Controller Based Status Bar Appearance = NO” 对我没有起作用,但是 “View controller-based status bar appearance = NO” 起了作用。 - tmr

    16

    为了使用传统的UIApplication方法来隐藏/显示状态栏,您的应用程序必须设置一个iOS 7的plist值:

    View-Controller Based Status Bar Appearance = NO

    默认情况下,此值设置为YES。如果将其更改为NO,则可以使用旧的方法。如果将其保留为YES,则仍然可以隐藏状态栏,但需要在应用程序中的每个视图控制器子类中覆盖:prefersStatusBarHidden并返回YES。

    每当您的应用程序需要更改状态栏外观或可见性,并且View-Controller Based Status Bar Appearance设置为YES时,您的最外层视图控制器需要调用:

    setNeedsStatusBarAppearanceUpdateAnimation


    我不得不在自定义iOS目标属性中应用,因为在通用的plist中无法工作。 - xarly

    11

    有很多组合建议来解决这个问题,但问题在于iOS 6和7使用不同的方法来隐藏状态栏。我从未成功设置plist设置以在iOS 7上启用iOS 6样式行为,但如果您正在构建支持iOS 6+的应用程序,则需要同时使用3种方法来确保特定视图控制器隐藏状态栏:

    // for ios 7 
    - (BOOL)prefersStatusBarHidden{
        return YES;
    }
    
    // for ios 6
    - (void)viewWillAppear:(BOOL)animated {
        [super viewWillAppear:animated];
        [[UIApplication sharedApplication] setStatusBarHidden:YES];
    }
    - (void)viewWillDisappear:(BOOL)animated {
        [super viewWillDisappear:animated];
        // explicitly set the bar to show or it will remain hidden for other view controllers
        [[UIApplication sharedApplication] setStatusBarHidden:NO];
    }
    

    无论您的plist设置如何,这都应该可以工作。


    7

    我必须进行以下两个更改来隐藏状态栏:

    将此代码添加到您想要隐藏状态栏的视图控制器中:

    - (BOOL)prefersStatusBarHidden
    {
        return YES;
    }
    

    将以下内容添加到您的 .plist 文件中(在应用程序设置中转到“信息”):
    View controller-based status bar appearance --- NO
    

    然后您可以调用此行来隐藏状态栏:

    [[UIApplication sharedApplication] setStatusBarHidden:YES];
    

    6
    尝试这个简单的方法:
    - (void)viewWillAppear:(BOOL)animated
    {
    [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];
    }
    
    - (void)viewWillDisappear:(BOOL)animated
    {
    [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];
    }
    

    6

    只需在info.plist文件中添加以下2行内容。这将修复iOS7及更早版本的问题。

    • 状态栏最初隐藏 = YES
    • 基于视图控制器的状态栏外观 = NO

    导航到项目并选择Targets -> General,查看“状态栏样式......应用程序启动时隐藏”复选框是否已选中。这将解决问题。


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