我想移除屏幕顶部的状态栏。

这行不通:

func application
(application: UIApplication,
didFinishLaunchingWithOptions launchOptions: NSDictionary?)
-> Bool
{
        application.statusBarHidden = true
        return true
}

我也试过:

func application
(application: UIApplication,
didFinishLaunchingWithOptions launchOptions: NSDictionary?)
-> Bool
{
    self.window = UIWindow(frame: UIScreen.mainScreen().bounds)

    var controller = UIViewController()
    application.statusBarHidden = true
    controller.setNeedsStatusBarAppearanceUpdate()

    var view = UIView(frame: CGRectMake(0, 0, 320, 568))
    view.backgroundColor = UIColor.redColor()
    controller.view = view

    var label = UILabel(frame: CGRectMake(0, 0, 200, 21))
    label.center = CGPointMake(160, 284)
    label.textAlignment = NSTextAlignment.Center
    label.text = "Hello World"
    controller.view.addSubview(label)

    self.window!.rootViewController = controller
    self.window!.makeKeyAndVisible()
    return true
}

当前回答

如果你更喜欢可视化的方法而不是编码,请使用以下方法: 在你的info.plist

简单地添加基于视图控制器的状态栏外观为NO

和状态栏最初隐藏为YES

其他回答

因此,这里的问题实际上与Swift无关,而是与iOS 7如何处理状态栏外观有关。

默认情况下,当视图控制器在屏幕上时,它们单独控制状态栏的外观。如果你想使用这种方法来控制状态栏,你可以为任何你想修改外观的视图控制器重写以下方法:

prefersStatusBarHidden, preferredStatusBarStyle, preferredStatusBarAnimation,

在你的例子中,你只需要实现prefersStatusBarHidden并返回true。

另一种方法是在应用程序级别控制状态栏的外观。这似乎是你实际上要做的(通过设置application.statusBarHidden)。

为了让这个工作,你需要打开你的应用程序的信息。并添加键UIViewControllerBasedStatusBarAppearance,并给它一个值NO。

斯威夫特 5+

在我的例子中,我需要根据某些条件更新隐藏的状态栏。

因此,我创建了一个包含新属性hideStatusBar的基本控制器BaseViewController。

其他视图控制器是这个基控制器的子类。最后,当我想要更新状态栏行为时,我只需要更改这个hideStatusBar值。

class BaseViewController: UIViewController {

    var hideStatusBar: Bool = false {
        didSet {
            setNeedsStatusBarAppearanceUpdate()
        }
    }

    override var prefersStatusBarHidden: Bool {
           return hideStatusBar
    }
}

如何使用

final class ViewController: BaseViewController, UIScrollViewDelegate {
    let scrollView = UIScrollView()

    ...

    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        UIView.animate(withDuration: 0.3) {
            if scrollView.contentOffset.y > 100 {
                self.hideStatusBar = true
            } else {
                self.hideStatusBar = false
            }
        }
    }
}

Demo

这是一个演示,我使用UIView.animate(…)使过渡更流畅。

你真的应该在你的视图控制器上实现prefersStatusBarHidden:

Swift 3及后续版本

override var prefersStatusBarHidden: Bool {
    return true
}

只是补充,当覆盖prefersStatusBarHidden方法或变量时,基于视图控制器的状态栏出现在信息中。plist必须为YES,否则重写将不起作用

更新为iOS 13和Swift 5

如果以上答案都不适合你。检查你的plist,看看你是否有这个:

“基于视图控制器的状态栏外观”

如果是,请确保将其设置为YES!!!!!

然后下面的代码将工作。

override var prefersStatusBarHidden: Bool {
    return true
}