【问题标题】:Swift 4 - Specific View Controller status bar style not changingSwift 4 - 特定视图控制器状态栏样式不变
【发布时间】: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 的建议

【问题讨论】:

标签: ios swift uiviewcontroller uikit swift4


【解决方案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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-05
      • 1970-01-01
      • 2018-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多