如何在Swift iOS应用程序中隐藏状态栏?

时间:2014-06-16 05:04:05

标签: ios iphone ios7 swift

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

这不起作用:

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
}

27 个答案:

答案 0 :(得分:408)

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

swift 2

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

swift 3及更高版本

override var prefersStatusBarHidden: Bool {
    return true
}

答案 1 :(得分:95)

  1. 转到Info.plist文件
  2. 将鼠标悬停在其中一条线上,然后会显示一个(+)和( - )按钮。
  3. 点击加号按钮添加新密钥输入以大写字母V开头,第一个选择将是基于视图控制器的状态栏外观。
  4. 将其添加为KEY。
  5. 将VALUE设为“NO”
  6. 转到AppDelegate.swift
  7. 在方法

    中添加代码
    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject:AnyObject]?) -> Bool {
        application.statusBarHidden = true
        return true
    }
    
  8. 完成!运行您的应用程序,不再有状态栏!

答案 2 :(得分:69)

Swift 3

Info.plist设置View controller-based status bar appearanceNO

并致电UIApplication.shared.isStatusBarHidden = true

答案 3 :(得分:36)

如果您想隐藏并恢复状态栏点击按钮,则在展示和解除滑入式菜单时,弹出窗口< / strong>等,然后你可以使用这个方法: -

隐藏状态栏: -

UIApplication.shared.keyWindow?.windowLevel = UIWindowLevelStatusBar

要恢复状态栏: -

UIApplication.shared.keyWindow?.windowLevel = UIWindowLevelNormal 

答案 4 :(得分:32)

如果您更喜欢视觉方法而不是编码,请使用此方法: 在info.plist

enter image description here 只需将View controller-based status bar appearance添加到NO

即可

Status bar is initially hiddenYES

答案 5 :(得分:28)

iOS 10 / Swift 3.0更新

不再是一个功能,现在是一个属性......

override var prefersStatusBarHidden: Bool {
    return true
}

答案 6 :(得分:26)

 override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(true);
    navigationController?.navigationBar.hidden = true // for navigation bar hide
    UIApplication.sharedApplication().statusBarHidden=true; // for status bar hide
}

答案 7 :(得分:15)

Swift 3.x中的

override func viewWillAppear(_ animated: Bool) {
    UIApplication.shared.isStatusBarHidden = true
}

答案 8 :(得分:12)

转到您的Info.plist并添加两个密钥:

Go to your Info.plist and add two Keys:

答案 9 :(得分:12)

所以这里的问题实际上与Swift无关,而是从iOS 7开始处理状态栏的外观。

默认情况下,视图控制器在屏幕上单独控制状态栏的外观。如果要使用此方法来控制状态栏,可以为要修改外观的任何视图控制器覆盖以下方法:

prefersStatusBarHiddenpreferredStatusBarStylepreferredStatusBarAnimation

在您的情况下,您只需实施prefersStatusBarHidden并返回true

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

为了完成这项工作,您需要打开应用的Info.plist文件并添加密钥UIViewControllerBasedStatusBarAppearance,并将其值设为NO

答案 10 :(得分:8)

我实际上是自己想出来的。我将添加我的解决方案作为另一种选择。

extension UIViewController {
    func prefersStatusBarHidden() -> Bool {
        return true
    }
}

答案 11 :(得分:6)

迅速5 +

就我而言,我需要根据某些情况更新隐藏的状态栏。

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

其他视图控制器是此基本控制器的子类。最后,当我要更新状态栏行为时,只需更改此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
            }
        }
    }
}

演示

这是一个演示,我正在使用UIView.animate(...)使过渡更加顺畅。

enter image description here

答案 12 :(得分:4)

好的,所以这对我来说是个问题,因为iOS 9并不支持人们在这里提到的方法,例如UIApplication.sharedApplication().statusBarHidden = true

UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: UIStatusBarAnimation.None)

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

有效,但不提供可编程解决方案,我可以在条件上进行更改。 (我们之前已经完成了statusBarHidden = truestatusBarHidden = false)。

解决这种疯狂行为:

通过添加到prefersStatusBarHidden(),如下所示,您可以通过编程方式控制隐藏和显示状态栏,而无需在 info.plist 中添加UIViewControllerBasedStatusBarAppearance设置:

var showStatusBar = true

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

private func showStatusBar(enabled: Bool) {
    showStatusBar = enabled
    prefersStatusBarHidden()
}

然后在整个代码中使用它:

//Hide Status Bar
showStatusBar(false)

OR

//Show Status Bar
showStatusBar(true)

答案 13 :(得分:3)

添加,当覆盖prefersStatusBarHidden方法或变量时,Info.plist中的View controller-based status bar appearance必须为YES,否则覆盖将无效

答案 14 :(得分:3)

在我的情况下,我正在寻找状态栏来隐藏/按需显示;而不是仅在视图加载或消失时。

swift 3.x

//show status bar initially
var showStatusBar = true

//set the parameters
override var prefersStatusBarHidden: Bool {

    if showStatusBar == true {

        //does not prefer status bar hidden
        print("does not prefer status bar hidden")
        return false

    } else {

        //does prefer status bar hidden
        print("does prefer status bar hidden")
    return true

    }
}

//ex: hide status bar and call parameter function again whenever you want
        showStatusBar = false
        setNeedsStatusBarAppearanceUpdate()

答案 15 :(得分:3)

在Swift 4.2中,它现在是一个属性。

override var prefersStatusBarHidden: Bool {
    return true
}

答案 16 :(得分:2)

在您的项目General-&gt; Deployment Info-&gt;状态栏样式中 选择隐藏状态栏的复选标记 注意: - 它会在整个应用程序中隐藏状态栏

答案 17 :(得分:1)

对我有用的解决方案;如果要在加载时隐藏特定视图控制器上的状态栏:

import UIKit

class ViewController: UIViewController {

private var hideStatusBar: Bool = false

override var prefersStatusBarHidden: Bool {
    return hideStatusBar
}

override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
    return UIStatusBarAnimation.slide
}

override func viewDidLoad() {
    super.viewDidLoad()

    view.backgroundcolor = .white
    hideStatusBar = true

    UIView.animate(withDuration: 0.3) {
        self.setNeedsStatusBarAppearanceUpdate()
    }
}

注意:如果您设置了密钥&#34; 查看基于控制器的状态栏外观&#34;到&#34; &#34;在您的info.plist中,上面的代码不起作用。您应该将密钥设置为&#34; &#34;或从info.plist中删除

答案 18 :(得分:1)

Swift 4

//MARK:- Show Status Bar
UIApplication.shared.isStatusBarHidden = false

//MARK:- Hide Status Bar
UIApplication.shared.isStatusBarHidden = true

答案 19 :(得分:1)

对于Swift 4+,请尝试以下代码(在Swift 4.0、4.1-IOS 10、11上测试):

override var prefersStatusBarHidden: Bool { return true }

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    // call this func to force preferredStatusBarStyle to be read again.
    setNeedsStatusBarAppearanceUpdate()
}

答案 20 :(得分:0)

已针对iOS 13和Swift 5更新

如果以上答案均不适合您。检查您的plist以查看是否具有此功能:

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

如果是这样,请确保将其设置为“是!!!!!”

然后下面的代码将起作用。

override var prefersStatusBarHidden: Bool {
    return true
}

答案 21 :(得分:0)

迅速5: 在主视图控制器中,或者在主导航控制器中(如果有)

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }

    override var prefersStatusBarHidden: Bool {
        return false
    }

并且plist中的“基于View Controller的状态栏外观”必须为YES,否则将不会调用上述代码。

如果要在启动应用程序时隐藏状态栏, plist中的“状态栏最初是隐藏的”必须为YES。 这样可以防止在屏幕顶部显示额外的蓝色条时启动图像失真。

答案 22 :(得分:0)

如果以模态方式显示视图控制器,请尝试

viewController.hidesBottomBarWhenPushed = true
viewController.modalPresentationCapturesStatusBarAppearance = true

答案 23 :(得分:0)

在您的项目 - &gt;常规 - &gt;部署信息

状态栏样式: -

刚刚标记为隐藏状态栏(iOS 10)

答案 24 :(得分:0)

您可以在ViewController Class scope

中使用此代码
open override var prefersStatusBarHidden: Bool { return true }

答案 25 :(得分:0)

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

答案 26 :(得分:0)

我正在使用Xcode 8.1(8B62),部署目标设置为10.1,我对上面提到的覆盖选项没有太多运气。但是,检查部署信息中的“隐藏状态栏”选项对我来说很有用。

Project > General

我希望这会有所帮助。