How to change the status bar background color and text color on iOS 13? How to change the status bar background color and text color on iOS 13? ios ios

How to change the status bar background color and text color on iOS 13?


You can add some conditions or use first one. Just create some extension for 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    }  }}

UPDATED: Sorry, I don't have enough time to test it in real projects, but it works in "Hello world" app. You can read more info about keyWindow and statusBarFrame in order to make it better.

extension UIApplication {var statusBarUIView: UIView? {    if #available(iOS 13.0, *) {        let tag = 3848245        let keyWindow = UIApplication.shared.connectedScenes            .map({$0 as? UIWindowScene})            .compactMap({$0})            .first?.windows.first        if let statusBar = keyWindow?.viewWithTag(tag) {            return statusBar        } else {            let height = keyWindow?.windowScene?.statusBarManager?.statusBarFrame ?? .zero            let statusBarView = UIView(frame: height)            statusBarView.tag = tag            statusBarView.layer.zPosition = 999999            keyWindow?.addSubview(statusBarView)            return statusBarView        }    } else {        if responds(to: Selector(("statusBar"))) {            return value(forKey: "statusBar") as? UIView        }    }    return nil  }}


Unfortunately Apple deprecated some of the mentioned methods of accessing the status bar and editing its attributes. You will have to use the StatusBarManager object of the WindowScene. The following method works for iOS 13 and above:

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)    }}


I have encountered this issue before. My application got crash while I run this code using XCode 11 and Swift 5.0.

Previous Code:-

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

Just Changed to:-

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)}

Now my problem solved. Happy coding.