在iOS 8应用程序中隐藏状态栏

74

我已经尝试过

[[UIApplication sharedApplication] setStatusBarHidden:YES]; 

这并没有任何作用。

我已经查看了我的Info.plist文件中的“View controller-based status bar appearance”,但它不在那里。

我该如何隐藏Xcode 6中我的应用程序顶部的白色状态栏(带有时钟和电池电量)?谢谢!


4
您可以根据需要向Info.plist添加条目。另外,我建议在Stack Overflow和Google中搜索。这个问题已经被问过很多次并得到了答案。您很快就需要知道如何搜索更复杂的问题的答案,最好现在开始学习。 - djromero
2
有效的批评,谢谢。 - Aggressor
2
只是一个建议 @djromero - 如果我们停止用户发布旧问题的新版本,那么答案就会过时 - 我们不应该鼓励这种行为吗?这也意味着回答这些问题的新手可以获得信用,整个系统也能保持活力。 - amergin
1
@amergin,我不认为这是批评。我只是想让你理解我的观点:一个问题不能算新鲜,只能算不同。重复的问题会使以后的搜索变得更加困难。你可以给我提出建议或批评:为什么你没有投票将其关闭为重复问题?我记不清了。 - djromero
它帮助了我,谢谢。 - Trần Thị Diệu My
显示剩余2条评论
7个回答

173

如果您没有该plist条目,每个视图控制器都需要覆盖此方法。

Objective-C

-(BOOL)prefersStatusBarHidden{
    return YES;
}

Swift 2

override func prefersStatusBarHidden() -> Bool {
    return true
}

Swift 3+

override var prefersStatusBarHidden: Bool {
    return true
}

不要忘记设置(如果您通过调用 presentViewController:animated:completion: 方法呈现视图控制器):

Objective-C

vcToBeShownWithoutStatusbar.modalPresentationCapturesStatusBarAppearance = YES;

Swift

vcToBeShownWithoutStatusbar.modalPresentationCapturesStatusBarAppearance = true

文档:https://developer.apple.com/reference/uikit/uiviewcontroller/1621453-modalpresentationcapturesstatusb

如果您想要从某些容器视图控制器(例如UINavigationController或带有子视图控制器的UIViewController)更改状态栏,并且您想要更改负责状态栏的视图控制器,则应使用childViewControllerForStatusBarHidden:属性。例如:

始终将第一个视图控制器实例设置为负责状态栏管理。

Objective-C

- (UIViewController *)childViewControllerForStatusBarHidden {
    return childViewControllers.first; // or viewControllers.first
}

Swift 2

override var childViewControllerForStatusBarHidden() -> UIViewController? {
    return childViewControllers.first // or viewControllers.first
}

Swift 3+

override var childViewControllerForStatusBarHidden: UIViewController? {
    return childViewControllers.first // or viewControllers.first
}

设置容器视图控制器负责状态栏管理

Objective-C

- (UIViewController *)childViewControllerForStatusBarHidden {
    return nil;
}

Swift 2

override func childViewControllerForStatusBarHidden() -> UIViewController? {
    return nil
}

Swift 3+

override var childViewControllerForStatusBarHidden: UIViewController? {
    return nil
}

Documentation: https://developer.apple.com/documentation/uikit/uiviewcontroller/1621451-childviewcontrollerforstatusbarh


有没有一种全局的方法,可以在AppDelegate中重置代码? - CaffeineShots
是的,创建你自己的UIViewController然后继承它。 - VaporwareWolf
不要忘记调用 setNeedsStatusBarAppearanceUpdate,如果你需要在任意时间强制更新当前视图控制器。 - Albert Renshaw

121
  1. 前往 Info.plist 文件。
  2. 将鼠标悬停在其中一行上,会出现一个 (+) 和 (-) 按钮。
  3. 点击加号按钮以添加新的键。
  4. 输入 以大写字母 V 开头,自动选择第一个选项为 View controller-based status bar appearance。将其作为 KEY 添加。
  5. 将 VALUE 设置为“NO”。
  6. 对于 Objective-C,请转到 AppDelegate.m (对于 Swift 语言:AppDelegate.swift)。
  7. 在方法内添加代码。

对于 Objective-C:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [application setStatusBarHidden:YES];

    return YES;
}

针对Swift编程语言:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey:Any]?) -> Bool {
    application.statusBarHidden = true

    return true
}

完成!运行您的应用程序,不再显示状态栏!


2
谢谢,这是我第一次找到有人解释得这么好并且让我真正理解。 - Karl Humphries
7
如果您已经在info.plist中添加了一个新的键,那么只需要完成前5个步骤即可。另外,请添加一个名为“Status bar is initially hidden”的键,并将其值设置为“Yes”。 - Mehul Thakkar
谢谢您的!!!只是一个小建议 - 您不需要在appDelegate文件中编写代码,而是选择在XCode目标设置中隐藏状态栏选项,plist更改仍然适用。愉快的编码!!! - Ashwin G

27
你可以在不写任何代码的情况下隐藏状态栏,只需要在info.plist中输入两个条目。第一个是“View controller-based status bar appearance”设置为NO,第二个是“Status bar is initially hidden”设置为YES。

视图控制器基于状态栏外观完成了工作! - Makalele

11
你可以将该行添加到Info.plist文件中,如果它尚不存在。只需在Xcode中进入项目,转到“信息”部分,悬停在现有行之一上。这时应出现一个“+”按钮,允许您添加一行并输入“View controller-based status bar appearance”。

谢谢你的建议,我使用了上面的答案,但是知道它是如何工作的也很好!非常感谢。 - Aggressor
这个答案需要适用于iOS 9。 - Beto

9

对于使用 Swift 3 的 iOS 10,您应该使用:

override var prefersStatusBarHidden: Bool {
    get {
        return true
    }
}

1
确实,这适用于iOS 10。我更喜欢短版本的“override var prefersStatusBarHidden: Bool { return true }”。 - Calin Chitu

3
  1. 打开 info.plist 文件
  2. 将 "View controller-based status bar appearance" 设置为 NO
  3. 将 "Status bar is initially hidden" 设置为 YES
  4. 完成

无需编写任何代码...干杯!


-4
如果您使用UIDocumentInteractionController来显示数据,则永远不要隐藏状态栏,因此我有替代方法。
 [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

这行代码将状态栏内容的颜色更改为白色


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