Swift 4-特定的View Controller状态栏样式不变

Mac*_*ver 2 uiviewcontroller uikit ios swift swift4

实施后UIViewController,状态栏内容的颜色似乎由于某种原因没有改变(仍然保持黑色)。仅使用特定的Swift 4.0,如何通过编程将其更改为“浅色”模式(白色)UIViewController?不是整个应用程序。

ViewController.swift类

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()            
        view.backgroundColor = UIColor.blue

        self.title = "Hello World"
        self.navigationController?.navigationBar.barTintColor = UIColor.gray
        self.navigationController?.navigationBar.prefersLargeTitles = true
        self.navigationController?.navigationItem.largeTitleDisplayMode = .automatic

        self.navigationController?.navigationBar.largeTitleTextAttributes = [
            NSAttributedStringKey.foregroundColor: UIColor.white,
            NSAttributedStringKey.font : UIFont.preferredFont(forTextStyle: .largeTitle)
        ]
    }

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

jake.lange的建议

在此处输入图片说明

jak*_*nge 8

您的UINavigationController是设置preferredStatusBarColor的一项。我敢打赌,如果您尝试展示此VC,而不是将其推送到导航控制器,则会看到灯光状态栏样式。

您可能要做的是实现自定义导航控制器并覆盖首选状态栏样式。

class CustomNavController: UINavigationController {
    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent;
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:

根据评论,您可能希望将首选状态栏颜色设置为UINavigationController最顶部的ViewController。这是执行此操作的扩展,使用此扩展,您不再需要上面的CustomNavController类,而只使用了常规的UINavigationController。您还需要在每个视图控制器中覆盖首选的状态栏样式。归因于这个SO问题,请参见此处以了解关于statusbarstyle和导航控制器的更多深入讨论:preferredStatusBarStyle不被调用

extension UINavigationController {
    open override var childViewControllerForStatusBarStyle: UIViewController? {
        return self.topViewController
    }

    open override var childViewControllerForStatusBarHidden: UIViewController? {
        return self.topViewController
    }
}
Run Code Online (Sandbox Code Playgroud)