Swift 4 - 特定视图控制器状态栏样式不变

Posted

技术标签:

【中文标题】Swift 4 - 特定视图控制器状态栏样式不变【英文标题】:Swift 4 - Specific View Controller status bar style not changing 【发布时间】:2018-11-12 11:48:24 【问题描述】:

在实现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
    

jake.lange 的建议

【问题讨论】:

@MaihanNijat 我希望状态栏内容是白色而不是黑色。 ***.com/questions/39802420/… Change Status Bar Background Color in Swift 3的可能重复 那是 Swift 3,我用的是 Swift 4 它对 4 不起作用? 【参考方案1】:

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

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

class CustomNavController: UINavigationController 
    override var preferredStatusBarStyle: UIStatusBarStyle 
        return .lightContent;
    

编辑:

基于 cmets,您可能希望将首选状态栏颜色设置为 UINavigationController 最顶部的任何 ViewController。这是一个可以做到这一点的扩展,有了这个扩展,您不再需要上面的 CustomNavController 类,只需使用常规的 UINavigationController。您还需要覆盖每个视图控制器中的首选状态栏样式。感谢这个 SO 问题,有关状态栏样式和导航控制器的更深入讨论,请参见此处:preferredStatusBarStyle isn't called

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

    open override var childViewControllerForStatusBarHidden: UIViewController? 
        return self.topViewController
    

【讨论】:

由于某种原因无法正常工作。请参阅上面的最新屏幕截图。 你的错误是这一行window?.rootViewController = UINavigationController(rootViewController: CustomNavigationController())。改为window?.rootViewController = CustomNavigationController(rootViewController: ViewController()) 然后出现此错误:Use of unresolved identifier 'CustomNavigationController' 抱歉,这是我的拼写错误。固定线路为window?.rootViewController = CustomNavController(rootViewController: ViewController()) 如果我想要不同NavigationController 的默认状态栏颜色(黑色)怎么办?我该怎么做?【参考方案2】:

如果此标志“基于控制器的状态栏外观”设置为 NO,您能否检查 Info.plist 文件。它需要设置为 YES 以允许基于视图控制器的外观。

【讨论】:

【参考方案3】:

为我工作:

override func viewWillAppear(_ animated: Bool) 
  super.viewWillAppear(animated)

  self.navigationController?.navigationBar.barStyle = .blackTranslucent
  self.navigationController?.navigationBar.titleTextAttributes = [.foregroundColor: UIColor.white]


override var preferredStatusBarStyle: UIStatusBarStyle 
  return .lightContent

【讨论】:

以上是关于Swift 4 - 特定视图控制器状态栏样式不变的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 swift 在特定视图中更改状态栏颜色?

在 XCode 8.2 / Swift 3.0 中更改状态栏样式(没有“查看基于控制器的状态栏外观”)

Swift 4仅为一个视图控制器设置导航属性

一个视图控制器的状态栏样式

更新视图控制器之间的状态栏样式

如何使用 swift 在一个视图控制器中更改状态栏颜色?