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

Posted

技术标签:

【中文标题】是否可以更改所有视图控制器的状态栏颜色?【英文标题】:Is it possible to change Status Bar color for all view controllers? 【发布时间】:2018-05-24 18:47:13 【问题描述】:

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

有可能吗?

【问题讨论】:

【参考方案1】:

只需两步即可更改整个应用的状态栏样式。 ?

第一步

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

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

第 2 步

转到您项目的目标并在 General / Deployment Info 下,将 Status Bar StyleDefault 切换到 Light

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

【讨论】:

像魅力一样工作!【参考方案2】:

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

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

    return true

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

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

【讨论】:

显然这是自 ios 9.0 以来已弃用...【参考方案3】:

首先在 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

输出截图如下

【讨论】:

这不是黑客行为吗?应用可能会因此被拒绝? 是的...我看到多个答案告诉它...只需查看上面的答案之一..【参考方案4】:

您可以在应用程序启动期间或视图控制器的 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关于状态栏更改的内容。状态栏中只允许使用深色和浅色(白色和黑色)。

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

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

或者您可以通过应用程序委托以编程方式进行操作:

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

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

    如果您只需要在 UIViewController 级别设置状态栏样式,请在 .plist 文件中将 UIViewControllerBasedStatusBarAppearance 设置为 YES

    在viewDidLoad中添加函数-setNeedsStatusBarAppearanceUpdate

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

-

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


override var preferredStatusBarStyle: UIStatusBarStyle 
    return .lightContent

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

【讨论】:

【参考方案5】:

斯威夫特 4 在 AppDelegate.swift 添加这个扩展:

extension UINavigationController 
    override open var preferredStatusBarStyle: UIStatusBarStyle 
        return .lightContent
    

【讨论】:

在我看来,这应该是当今公认的答案。【参考方案6】:

是的, 第1步: 打开你的 info.plist 并插入一个名为“查看基于控制器的状态栏外观”的新键到 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

一切顺利

【讨论】:

【参考方案7】:

重要说明

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

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

布尔答案是,但是,在合法的方式,它是如此接近,如果你需要颜色,回答是是挑衅除了黑色或白色。

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

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

在 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

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

第三种方法——破解!

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 在一个视图控制器中更改状态栏颜色?

是否可以更改状态栏文本颜色?

在运行中以编程方式更改 iOS7 状态栏颜色?

在 iPhone 上切换应用时更改状态栏颜色的问题

更改状态栏背景颜色

为不同的视图控制器设置状态栏颜色