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

时间:2017-12-11 09:22:00

标签: ios swift uiviewcontroller statusbar uicolor

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

有可能吗?

7 个答案:

答案 0 :(得分:4)

equals

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

并将以下代码添加到func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { UIApplication.shared.statusBarStyle = .lightContent return true }

Info.plist

答案 1 :(得分:2)

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

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
}

输出屏幕截图如下 enter image description here

答案 2 :(得分:1)

您可以在应用程序启动期间或视图控制器的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
    }

}



结果如下:

enter image description here


以下是关于状态栏更改的Apple Guidelines/Instruction。只有黑暗&状态栏中允许亮(同时为黑色)。

以下是 - 如何更改状态栏样式

如果要设置状态栏样式,应用程序级别,请在“.plist”文件中将UIViewControllerBasedStatusBarAppearance设置为NO

或者以编程方式,您可以从app delegate:

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

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

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

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

  4. -

    override func viewDidLoad() {
        super.viewDidLoad()
        self.setNeedsStatusBarAppearanceUpdate()
    }
    
    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
    

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

答案 3 :(得分:1)

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

步骤1

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

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

步骤2

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

The Status Bar Style option can be found right under the device orientation selectors of the Xcode project's editor.

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

答案 4 :(得分:0)

是, 步骤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
}

一切顺利

答案 5 :(得分:0)

重要说明

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

  

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

布尔答案是,但以合法方式,它非常接近,如果您需要颜色,则回答“是”是挑衅性的其他黑色或白色。

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

第一种方法 - 整个应用程序的一种颜色

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

的密钥

View controller-based status bar appearance

并将其设置为

它做什么?它基本上建立了一个设置,表明在您的应用程序中,状态栏外观不是由每个视图控制器单独定义。理解这一点非常重要。这意味着您可以为所有屏幕设置整个应用程序的统一设置。这就是你需要的。但。您仅限于两种设置:白色和黑色。并且您无法使用文档化的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,以便状态栏不会使用每个视图控制器初始化其样式。

答案 6 :(得分:0)

斯威夫特4 在AppDelegate.swift中添加以下扩展名:

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