繁体   English   中英

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

[英]How do I hide the status bar in a Swift iOS app?

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

这不起作用:

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
}

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

Swift 3 及更高版本

override var prefersStatusBarHidden: Bool {
    return true
}
  1. 转到 Info.plist 文件
  2. 将鼠标悬停在其中一行上,将显示 (+) 和 (-) 按钮。
  3. 单击加号按钮以添加新的键键入以大写 V 开头,第一个选项将自动成为基于视图控制器的状态栏外观。
  4. 将其添加为 KEY。
  5. 将值设置为“否”
  6. 去找你 AppDelegate.swift
  7. 在方法内添加代码

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

完毕! 运行您的应用程序,不再有状态栏!

斯威夫特 3

Info.plistView controller-based status bar appearanceNO

并调用UIApplication.shared.isStatusBarHidden = true

如果您想在按钮点击时隐藏和恢复状态栏,而在呈现和关闭滑入菜单弹出窗口等时,则可以使用此方法:-

隐藏状态栏:-

UIApplication.shared.keyWindow?.windowLevel = UIWindowLevelStatusBar

要恢复状态栏:-

UIApplication.shared.keyWindow?.windowLevel = UIWindowLevelNormal 

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

在此处输入图片说明 只需将View controller-based status bar appearanceNO

并且Status bar is initially hiddenYES

iOS 10 / Swift 3.0 更新

不再是一个函数,现在是一个属性......

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

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

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

在 Swift 3.x 中:

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

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

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

prefersStatusBarHiddenpreferredStatusBarStylepreferredStatusBarAnimation

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

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

为了让这个工作,你需要打开你的应用程序的Info.plist文件并添加键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
            }
        }
    }
}

演示

这是一个演示,我使用UIView.animate(...)使过渡更平滑。

在此处输入图片说明

其实我自己想通了。 我将添加我的解决方案作为另一种选择。

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

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

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

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

有效,但不提供我可以根据条件进行更改的可编程解决方案。 statusBarHidden = truestatusBarHidden = false正如我们之前所做的那样)。

解决这个疯狂的方法:

通过像下面这样添加到prefersStatusBarHidden() ,您可以以编程方式控制状态栏的隐藏和显示,而无需将UIViewControllerBasedStatusBarAppearance设置添加到您的info.plist

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)

或者

//Show Status Bar
showStatusBar(true)

补充一下,在覆盖prefersStatusBarHidden方法或变量时,Info.plist中View controller-based status bar appearance必须为YES,否则覆盖将无效

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

override var prefersStatusBarHidden: Bool {
    return true
}

就我而言,我正在寻找状态栏以按需隐藏/显示; 而不仅仅是在视图加载或消失时。

快速 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()

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

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }

    override var prefersStatusBarHidden: Bool {
        return false
    }

并且plist中的“View controller-based status bar appearance”必须为YES,否则上面的代码不会被调用。

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

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

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()
    }
}

注意:如果您在 info.plist 中将键“基于控制器的状态栏外观”设置为“”,则上面的代码不起作用。 您应该将密钥设置为“ YES ”或其从 info.plist 中删除

在您的项目 General->Deployment Info->Status bar style 中选择 Hide status bar 的复选标记注意:- 它在整个应用程序中隐藏状态栏

对于 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()
}

针对 iOS 13 和 Swift 5 更新

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

“查看基于控制器的状态栏外观”

如果是这样,请务必将其设置为 YES!!!!

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

override var prefersStatusBarHidden: Bool {
    return true
}

我正在使用 Xcode 8.1 (8B62) 并将部署目标设置为 10.1,但我对上述覆盖选项的运气不佳。 然而,检查部署信息中的“隐藏状态栏”选项对我来说很有效。

项目 > 一般

我希望这有帮助。

如果您以模态方式呈现视图控制器,请尝试

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

您可以在ViewController Class scope使用此代码

open override var prefersStatusBarHidden: Bool { return true }

在您的项目->常规->部署信息中

状态栏样式:--

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

斯威夫特 4

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM