无法在iOS7中隐藏状态栏


267

我刚刚将iPhone 5 iOS 7升级到了四个Beta版本。现在,当我在此iPhone上从Xcode 5运行我的应用程序时,状态栏不会隐藏,即使应该隐藏。

不起作用:

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

不起作用:

[UIApplication sharedApplication].statusBarHidden = YES;

无法登录苹果开发者论坛


15
不正确,我的答案涉及Xcode,并且已经向公众展示。过于笼统地说“如果您回答这个问题,那就是违反了NDA” ..让开发人员自行决定;-)
Jake


如何以编程方式隐藏特定于ViewController的状态栏?
bhavik

Answers:


558

在您的应用程序plist文件中,添加一行名为“基于视图控制器的状态栏外观”并将其设置为“否”

请注意,如果您在应用程序中使用UIImagePickerController,则这根本行不通。

来自http://www.openfl.org/developer/forums/general-discussion/iphone-5ios-7-cant-hide-status-bar/,mgiroux的解决方案

An example adding View Base Controller to your Info settings in Xcode


3
惊人!我在这个上浪费时间!谢谢!
伊丹2013年

12
作为参考,存储在实际Info.plist文件中的原始值称为UIViewControllerBasedStatusBarAppearance
亚当·罗森菲尔德

55
这种方法的唯一问题是,如果使用UIImagePickerController选择图像,它将强制状态栏再次出现。防止这种情况的唯一肯定的方法是在每个视图控制器中实现preferredsStatusBarHidden方法并重置UIViewControllerBasedStatusBarAppearance plist设置为true。
詹森·富尔滕贝格

5
我真的不知道为什么苹果改变了这个!谢谢:)
穆罕默德·阿米尼

18
您还需要设置Status bar is initially hiddenYES
Zorayr 2014年

277

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

- (BOOL)prefersStatusBarHidden {
    return YES;
}

35
对于所有查找对象,如果要在某些视图中动态删除状态栏,则可以使用此方法。无论您在plist中将“基于视图控制器的状态栏外观”设置为什么,此方法都有效!
T先生2013年

2
+1 b / c我正在寻找能够动态显示/隐藏状态栏的功能。但是,P列表设置方法(请参见上面@Satgi的帖子)是全局显示/隐藏状态栏的最佳方法。
JonnyB

如果您在某个地方有一个照相馆,通常只希望在其中隐藏控件,也可以将其打开/关闭。这对我不起作用,甚至没有调用该函数。我在同一地方拥有
PreferredStatusBarStyle

4
@ Mr.T在iOS 8中,情况似乎不再如此。如果您已将基于视图控制器的状态栏外观设置为NO,并prefersStatusBarHidden在视图控制器中返回true ,则它将不起作用。状态栏仍然出现。
Isuru 2014年

1
@Isuru您为什么设置为NO?如果设置为YES,则在其他情况下不会询问每个视图控制器。
invoodoo 2014年

84

在Plist中添加以下属性。

-> Status bar is initially hidden=是

-> View controller-based status bar appearance=否

两者都添加-现在状态栏将消失。


是的,这也对我有用。如果未将“状态栏最初处于隐藏状态”选项设置为“是”,则它无法正常工作。谢谢。
AndrewShmig 2014年

53

要在单个视图上隐藏状态栏,应使用:

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

最初,这对我不起作用,然后在此方法的文档中看到://如果您的应用程序使用的是默认的基于UIViewController的状态栏系统,则设置statusBarHidden不会执行任何操作。

这必须在plist文件上完成,将键View controller-based status bar appearance集添加到NO。然后它起作用了。


16

为了使用旧版UIApplication方法隐藏/显示状态栏,您的应用必须为iOS 7设置plist值:

View-Controller Based Status Bar Appearance = NO

默认情况下,此值设置为YES。如果将其更改为NO,则可以使用旧方法。如果将其设置为YES,您仍然可以隐藏状态栏,但是要由您应用中的每个View Controller子类覆盖:prefersStatusBarHidden返回YES。

每当您的应用需要状态栏外观或可见性进行更改,并且基于视图控制器的状态栏外观设置为YES时,最外层的视图控制器都需要调用:

setNeedsStatusBarAppearanceUpdateAnimation


我必须在“自定义iOS目标属性”中申请,因为在一般的plist中不起作用
2013年

16

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

  1. 不适用:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    [application setStatusBarHidden:YES];
  2. 在info.plist中添加此

    View-Controller Based Status Bar Appearance = NO

2
只是清理一下,如果您将其放入didFinishLaunching中,则可以编写[application setStatusBarHidden:YES];application.statusBarHidden = YES;
joel.d 2014年

上面可能有错字。“基于视图控制器的状态栏外观=否”对我不起作用,但是“基于视图控制器的状态栏外观=否”对我有用。
tmr

11

建议针对此问题的组合太多,但问题是iOS 6和7使用不同的方法来隐藏状态栏。我从未成功设置plist设置以在iOS 7上启用iOS6-style行为,但是如果您要构建支持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

只需在info.plist文件中添加这两行。它将同时修复iOS7和旧版本。

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

导航到项目,然后选择“目标”->“常规”,然后将看到“状态栏样式...在应用程序启动期间隐藏”复选框。这将起作用。


6

试试这个简单的方法:

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

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

4

对我唯一有效的方法是在您的plist中添加以下内容

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

4

我发现在整个应用程序中隐藏状态栏的最简单方法是创建一个categoryon UIViewController并覆盖它prefersStatusBarHidden。这样,您不必在每个视图控制器中都编写此方法。

UIViewController + HideStatusBar.h

#import <UIKit/UIKit.h>

@interface UIViewController (HideStatusBar)

@end

UIViewController + HideStatusBar.m

#import "UIViewController+HideStatusBar.h"

@implementation UIViewController (HideStatusBar)

//Pragma Marks suppress compiler warning in LLVM. 
//Technically, you shouldn't override methods by using a category, 
//but I feel that in this case it won't hurt so long as you truly 
//want every view controller to hide the status bar. 
//Other opinions on this are definitely welcome

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"

- (BOOL)prefersStatusBarHidden
{
    return YES;
}

#pragma clang diagnostic pop


@end

最真实的,iOS7,非fakey解决方案,极大
Fattie

3
  1. 在plist中添加----

    查看基于控制器的状态栏外观---否

  2. 在每个viewController中写

    - (void) viewDidLayoutSubviews
    {
        CGRect viewBounds = self.view.bounds;
        CGFloat topBarOffset = 20.0;
        viewBounds.origin.y = -topBarOffset;
        self.view.bounds = viewBounds;
    
        [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];//for status bar style
    }

对于iOS 7中的状态栏问题,但该应用程序的目标应为5.1或更高版本


3

该线程上的许多答案都可以工作,但是据我了解,如果您尝试做任何动态的事情,最终需要调用:

[self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)];

3

在iOS 7中隐藏状态栏的步骤:

1.转到您的应用程序info.plist文件。

2.AndSet,基于视图控制器的状态栏外观:布尔型NO

希望我解决了状态栏问题.....


3

对于单个视图中的iOS 7,请在viewWillappear方法中使用:

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

要显示状态栏,请使用:

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


2

在“信息列表”文件中,为以下属性添加一行

属性名称:基于视图控制器的状态栏外观

值:无


1

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

- (BOOL)prefersStatusBarHidden
    {
        return YES;
    }

1

我尝试了在我的项目中发布在这里的所有这些选项,它们将无法工作。我认为这可能与以下事实有关:我先更新Xcode了应用程序,然后将其更新为iOS 7,并且某些设置被弄乱了。我决定为其构建一个全新的项目,并只需简单地设置:“ Status bar is initially hidden = YES”和“ View controller-based status bar appearance = NO”(正如许多其他人所言,它就可以正常工作(即,没有状态栏))。

因此,如果您正在处理的项目已从旧版本更新到iOS 7,并尝试了所有其他选项,那么我的建议是构建一个新项目。


我最初使用相同的技术来确认可以针对每个屏幕全局隐藏状态栏,但是由于我的应用程序非常“以时间为中心”,因此我希望大多数屏幕都显示时间。由于各种原因,它只是一个屏幕,我想排除它。我最终使用了与您相反的参数:最初隐藏=否&基于VC的状态栏外观= YES。 然后,我必须将(BOOL)prefersStatusBarHidden方法(返回YES)放入要隐藏它的一个VC中。效果很好。我应该补充说,由于其他原因,我的应用程序仅适用于iOS7。
bobsmells

1

对于2019年...

要制作没有状态栏的应用,

单击info.plist,右键单击“添加行”。

使用以下设置添加这两个:

在此处输入图片说明

这里的所有都是它的。




0

隐藏特定viewController的状态栏

- (BOOL)prefersStatusBarHidden {
    return YES;
}

对于设置为应用程序隐藏的状态栏:

  • View controller-based status bar appearanceNO的的.plist和 application: didFinishLaunchingWithOptions:集: [application setStatusBarHidden:YES];

    注意:setStatusBarHidden:已弃用

要么

  • 在项目设置->常规选项卡->部署信息中

    检查Hide Status bar框。


-1
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
application.statusBarHidden = YES;
return YES;
}

问题明确提到该方法无效。请在回答之前仔细阅读问题。
Borys Verebskyi '16

只要基于视图控制器的状态栏外观设置为“否”,这就是最干净的方法。
埃文·伊切

-7

我不确定为什么您“无法登录到Apple开发者论坛”,但是(在不违反NDA的前提下)您还可以通过Xcode隐藏statusBar。这是应用程序目标上的常规设置。在此处输入图片说明


不,就像魅力一样。论坛已经有一段时间了。
杰克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.