是否可以更改所有视图控制器的状态栏颜色?

Is it possible to change Status Bar color for all view controllers?

我已经搜索了一段时间,但我只找到了描述在一个视图控制器上更改颜色而不是在所有视图控制器上更改颜色的答案。

可以吗?

设置状态栏的样式AppDelegate.swift:

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

    return true
}

并将以下代码添加到您的 Info.plist:

<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>

是的, 步骤1: 打开你的 info.plist 并插入一个名为 "View controller-based status bar appearance" 的新密钥到 NO

第 2 步: 打开要更改 statusBarStyle 的 viewcontroller 文件并将以下代码放入 viewWillAppear(),

UIApplication.shared.statusBarStyle = .lightContent

第 3 步:

此外,为特定 viewController 实现 viewWillDisappear() 方法并放置以下代码行,

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    UIApplication.shared.statusBarStyle = UIStatusBarStyle.default
}

祝一切顺利

首先在 info.plist 中将基于视图控制器的状态栏外观设置为 NO

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.

let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
   if statusBar.responds(to:#selector(setter: UIView.backgroundColor)) {
        statusBar.backgroundColor = UIColor.blue
    }
    UIApplication.shared.statusBarStyle = .lightContent

    return true
}

输出截图如下

您可以在应用程序启动期间或视图控制器的 viewDidLoad 期间为状态栏设置背景颜色。

extension UIApplication {

    var statusBarView: UIView? {
        return value(forKey: "statusBar") as? UIView
    }

}

// Set upon application launch, if you've application based status bar
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

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


or 
// Set it from your view controller if you've view controller based statusbar
class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        UIApplication.shared.statusBarView?.backgroundColor = UIColor.red
    }

}



这是结果:


Apple Guidelines/Instruction 关于状态栏的更改。状态栏中只允许 Dark & light (while & black)。

这里是 - 如何更改状态栏样式:

如果你想设置状态栏样式,应用级别然后在你的`.plist'文件中设置UIViewControllerBasedStatusBarAppearanceNO

或者您可以通过应用委托以编程方式完成:

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

如果您想在视图控制器级别设置状态栏样式,请按照以下步骤操作:

  1. 如果您只需要在 UIViewController 级别设置状态栏样式,请在 .plist 文件中将 UIViewControllerBasedStatusBarAppearance 设置为 YES
  2. 在viewDidLoad中添加函数——setNeedsStatusBarAppearanceUpdate

  3. 在您的视图控制器中覆盖 preferredStatusBarStyle。

-

override func viewDidLoad() {
    super.viewDidLoad()
    self.setNeedsStatusBarAppearanceUpdate()
}

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

根据状态栏样式设置级别设置.plist的值。

重要说明

了解两种自定义状态栏的方法非常重要。

Is it possible to change Status Bar color for all view controllers?

布尔答案是,但是,合法,它非常接近 如果您需要黑色或白色以外的颜色,那么回答“是”是挑衅。

自定义状态栏外观有两种方法。

第一种方法——整个应用使用一种颜色

在 info.plist 中,您找到或创建了一个名为

的密钥

View controller-based status bar appearance

并将其设置为NO

它有什么作用?它实质上建立了一个设置,表明在您的应用程序中,状态栏外观 不是由每个视图控制器单独定义的 。理解这一点非常重要。这意味着您对整个应用程序、所有屏幕都有统一的设置。这就是你所需要的。但。您仅限于两种设置:白色和黑色。而且您无法使用已记录的 API.

对其进行自定义

要进行设置:

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

第二种方法——每个视图控制器的单独颜色

这是相反的。要使其工作,请继续 info.plist 并设置

View controller-based status bar appearance

这样,每当打开一个新的视图控制器时,如果您在每个需要的 UIViewController 实例中插入此实现,就会单独设置状态栏样式:

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

和第一个一样,为状态栏设置深色或浅色样式。

第三种方法——Hack!

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

    if let statusbar = value(forKey: "statusBar") as? UIView {
        statusbar.backgroundColor = UIColor.blue
    }

    return true
}

为什么要破解?如果您需要黑色或白色以外的状态栏颜色。这里使用未记录的 API。您使用 KVC 获取 statusBar 对象并手动设置其颜色。这是肮脏的,不合法的方式,但到目前为止,这是为状态栏设置自定义颜色的唯一方式。它很可能会导致您的应用程序被拒绝。但也许你很幸运。为了一劳永逸地设置它,您需要将上述标志设置为 NO,这样状态栏就不会在每个视图控制器中初始化它的样式。

Swift 4 在 AppDelegate.swift 中添加此扩展名:

extension UINavigationController {
    override open var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
}

只需要两步就可以改变整个应用的状态栏样式。

第 1 步

向项目的 Info.plist 文件添加一个新的 属性 并将其设置为 false

<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>

第 2 步

转到项目的目标并在常规/部署信息下,将Status Bar StyleDefault切换到Light

执行这些步骤将确保状态栏在整个项目中的行为相同。