Swift:为iOS 13更改状态栏颜色

时间:2019-09-15 11:30:41

标签: ios swift statusbar

对于ios 13,我无法设置状态栏的文本颜色。如何获取statusBarManager的视图?如何仅更改文本颜色?

由于:

  

由于未捕获的异常“ NSInternalInconsistencyException”而终止应用程序,原因:“ UIApplication上的名为-statusBar或-statusBarWindow的应用程序:由于不再有状态栏或状态栏窗口,因此必须更改此代码。而是在窗口场景上使用statusBarManager对象。'

我当前的代码:

    func setStatusBarTextColor(_ color: UIColor) {
        if #available(iOS 13.0, *) {
            // How to do for iOS 13??
        } else {
            if let statusBar = UIApplication.shared.value(forKey: "statusBar") as? UIView {
                statusBar.setValue(color, forKey: "foregroundColor")
            }
        }
    }

我已经找到了这个https://stackoverflow.com/a/57394751/9172697,但这不是我想要的

4 个答案:

答案 0 :(得分:6)

IOS 13.0和XCode 11.0(使用Swift 5.0 100%工作)

    if #available(iOS 13.0, *) {


       let statusBar1 =  UIView()
       statusBar1.frame = UIApplication.shared.keyWindow?.windowScene?.statusBarManager!.statusBarFrame as! CGRect
       statusBar1.backgroundColor = UIColor.black

       UIApplication.shared.keyWindow?.addSubview(statusBar1)

    } else {

       let statusBar1: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
       statusBar1.backgroundColor = UIColor.black
    }

答案 1 :(得分:1)

您可以在iOS 13上像这样使用

   let statusBar =  UIView()
   statusBar.frame = UIApplication.shared.statusBarFrame
   statusBar.backgroundColor = UIColor.red
   UIApplication.shared.keyWindow?.addSubview(statusBar)

答案 2 :(得分:0)

状态栏中的文本颜色永远不会由您决定;你在做什么总是错的。使用顶级视图控制器覆盖preferredStatusBarStyle。您有两个选择,.lightContent.darkContent,并且您都不应该使用它们,因为您要支持亮/暗模式。

答案 3 :(得分:-3)

更新后的答案

要更改状态栏上的文本颜色,只需设置样式。 (您没有太多选择,状态栏中的文本颜色可以是白色或黑色)

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

  1. 如果仅需要在UIViewController级别上设置状态栏样式,请在.plist文件中将UIViewControllerBasedStatusBarAppearance设置为YES。
  2. 在视图控制器中覆盖preferredStatusBarStyle

如果要更改iOS 13的状态栏背景,请使用以下代码:

extension UIApplication {

class var statusBarBackgroundColor: UIColor? {
    get {
        return statusBarUIView?.backgroundColor
    } set {
        statusBarUIView?.backgroundColor = newValue
    }
}

class var statusBarUIView: UIView? {
    if #available(iOS 13.0, *) {
        let tag = 987654321

        if let statusBar = UIApplication.shared.keyWindow?.viewWithTag(tag) {
            return statusBar
        }
        else {
            let statusBarView = UIView(frame: UIApplication.shared.statusBarFrame)
            statusBarView.tag = tag

            UIApplication.shared.keyWindow?.addSubview(statusBarView)
            return statusBarView
        }
    } else {
        if responds(to: Selector(("statusBar"))) {
            return value(forKey: "statusBar") as? UIView
        }
    }
    return nil
}}