如何在iOS 13上更改状态栏的背景颜色和文本颜色?

Hug*_*nso 49 statusbar ios swift ios13

随着iOS 13的到来,statusBar的视图不再能通过低谷访问:

value(forKey: "statusBar") as? UIView
Run Code Online (Sandbox Code Playgroud)

由于:

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

但是目前尚不清楚应如何使用它来更改颜色,因为keyWindow?.windowScene?.statusBarManager它似乎不包含与之相关的任何内容。

我正在编译具有(iOS 10,*)兼容性的代码,因此我打算继续使用UIKit。

关于这个主题有什么想法吗?

Ala*_*man 30

不幸的是,Apple 弃用了一些提到的访问状态栏和编辑其属性的方法。你将不得不使用StatusBarManager的对象WindowScene。以下方法适用于 iOS 13 及更高版本:

extension UINavigationController {

    func setStatusBar(backgroundColor: UIColor) {
        let statusBarFrame: CGRect
        if #available(iOS 13.0, *) {
            statusBarFrame = view.window?.windowScene?.statusBarManager?.statusBarFrame ?? CGRect.zero
        } else {
            statusBarFrame = UIApplication.shared.statusBarFrame
        }
        let statusBarView = UIView(frame: statusBarFrame)
        statusBarView.backgroundColor = backgroundColor
        view.addSubview(statusBarView)
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 所有答案中的最佳答案 (2认同)
  • 如果您不确定如何像我一样调用它,请在 viewDidAppear (感谢@Artiom)中调用 self.navigationController?.setStatusBar(backgroundColor: yourColor) 和 self.navigationController?.navigationBar.setNeedsLayout() (2认同)

小智 27

您可以添加一些条件或使用第一个条件。只需为UIApplication创建一些扩展即可。

extension UIApplication {
var statusBarUIView: UIView? {
    if #available(iOS 13.0, *) {
        let tag = 38482
        let keyWindow = UIApplication.shared.windows.filter {$0.isKeyWindow}.first

        if let statusBar = keyWindow?.viewWithTag(tag) {
            return statusBar
        } else {
            guard let statusBarFrame = keyWindow?.windowScene?.statusBarManager?.statusBarFrame else { return nil }
            let statusBarView = UIView(frame: statusBarFrame)
            statusBarView.tag = tag
            keyWindow?.addSubview(statusBarView)
            return statusBarView
        }
    } else if responds(to: Selector(("statusBar"))) {
        return value(forKey: "statusBar") as? UIView
    } else {
        return nil
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 在iOS 13中不推荐使用`keyWindow`。 (3认同)
  • 为什么要使用已弃用的东西? (2认同)

小智 8

我以前遇到过这个问题。当我使用 XCode 11 和 Swift 5.0 运行此代码时,我的应用程序崩溃了。

以前的代码:-

UIApplication.shared.statusBarView?.backgroundColor = UIColor.init(red: 243/250, green: 243/250, blue: 243/250, alpha: 1)
Run Code Online (Sandbox Code Playgroud)

刚改成:-

if #available(iOS 13.0, *) {
    let statusBar = UIView(frame: UIApplication.shared.keyWindow?.windowScene?.statusBarManager?.statusBarFrame ?? CGRect.zero)
     statusBar.backgroundColor = UIColor.init(red: 243/250, green: 243/250, blue: 243/250, alpha: 1)
     UIApplication.shared.keyWindow?.addSubview(statusBar)
} else {
     UIApplication.shared.statusBarView?.backgroundColor = UIColor.init(red: 243/250, green: 243/250, blue: 243/250, alpha: 1)
}
Run Code Online (Sandbox Code Playgroud)

现在我的问题解决了。快乐编码。

  • iOS 13 中已弃用“keyWindow”。 (5认同)

Nik*_*iki 6

对于 swift 5.0 我这样做是为了改变背景颜色,

    if #available(iOS 13.0, *) {
           let window = UIApplication.shared.windows.filter {$0.isKeyWindow}.first 
           // Reference - /sf/answers/4052930941/
           let statusBar = UIView(frame: window?.windowScene?.statusBarManager?.statusBarFrame ?? CGRect.zero)
           statusBar.backgroundColor = .white
           window?.addSubview(statusBar)
    } else {
           UIApplication.shared.statusBarView?.backgroundColor = .white
           UIApplication.shared.statusBarStyle = .lightContent
    }
Run Code Online (Sandbox Code Playgroud)

https://medium.com/@trivediniki94/surprises-after-upgrading-to-xcode-11-ios-13-b52b36e05fa8


C13*_*C13 6

这在 Swift 5 中对我有用

   override func viewDidLoad() {
      super.viewDidLoad()

      if #available(iOS 13, *)
      {
          let statusBar = UIView(frame: (UIApplication.shared.keyWindow?.windowScene?.statusBarManager?.statusBarFrame)!)
          statusBar.backgroundColor = #colorLiteral(red: 0.2346, green: 0.3456, blue: 0.5677, alpha: 1)
          UIApplication.shared.keyWindow?.addSubview(statusBar)
      } else {
         // ADD THE STATUS BAR AND SET A CUSTOM COLOR
         let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
         if statusBar.responds(to:#selector(setter: UIView.backgroundColor)) {
            statusBar.backgroundColor = #colorLiteral(red: 0.2346, green: 0.3456, blue: 0.5677, alpha: 1)
         }
         UIApplication.shared.statusBarStyle = .lightContent
      }
   }
Run Code Online (Sandbox Code Playgroud)


小智 2

你可以试试这个

if (@available(iOS 13, *))
{
    UIView *_localStatusBar = [[UIApplication sharedApplication].keyWindow.windowScene.statusBarManager performSelector:@selector(createLocalStatusBar)];
    statusBar = [_localStatusBar performSelector:@selector(statusBar)];
}
else
{
    statusBar = [[UIApplication sharedApplication] valueForKey:@"statusBar"];
}
Run Code Online (Sandbox Code Playgroud)

  • iOS 13 中已弃用“keyWindow”。 (4认同)