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

Posted

技术标签:

【中文标题】Swift:更改 iOS 13 的状态栏颜色【英文标题】:Swift: Change status bar color for iOS 13 【发布时间】:2020-01-16 12:20:37 【问题描述】:

对于 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://***.com/a/57394751/9172697,但这不是我要找的

【问题讨论】:

56651245 的可能重复项。 @chumps52 我不是重复的,因为我不能只改变文本颜色.. 【参考方案1】:

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
    

【讨论】:

keyWindow 在 iOS 13 中已弃用。【参考方案2】:

iOS 13 可以这样使用:

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

【讨论】:

【参考方案3】:

状态栏中文本的颜色从来都不是由你决定的;你所做的总是错的。使用您的***视图控制器覆盖preferredStatusBarStyle。你有两个选择,.lightContent.darkContent,你不应该使用,因为你想支持明暗模式。

【讨论】:

【参考方案4】:

IOS 15、Xcode 13.2.1、Swift 5

我能够使用以下方法使其正常工作而不会出现错误或警告:

func statusBarColor() 
    if #available(iOS 13.0, *) 
        
        let statusBar2 =  UIView()
        if UIApplication.shared.currentScene?.statusBarManager!.statusBarFrame != nil 
            statusBar2.frame = (UIApplication.shared.currentScene?.statusBarManager!.statusBarFrame)!
            statusBar2.backgroundColor = UIColor.init(named: "BackGroundColor")
            UIApplication.shared.windows.first?.addSubview(statusBar2)
        
     else 
        let statusBar2: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
        statusBar2.backgroundColor = UIColor.init(named: "BackGroundColor")
    

使用:调用viewDidLoad中的函数,用于单场景应用或只需要改变单个statusBar颜色的应用。对于有多个场景调用不同状态栏颜色的应用程序,我建议在 viewWillAppear 中调用该函数。

【讨论】:

【参考方案5】:

更新答案

要更改状态栏上的文本颜色,您只需要设置样式即可。 (你不必太多选项,状态栏的文字颜色可以是白色或黑色)

如果您想在视图控制器级别设置状态栏样式,请按照以下步骤操作:

    如果您只需要在 UIViewController 级别设置状态栏样式,请在 .plist 文件中将 UIViewControllerBasedStatusBarAppearance 设置为 YES。 在您的视图控制器中覆盖 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

【讨论】:

他不想改变背景,而是状态栏的文字 是的,但是请阅读他编写的代码,这是关于背景的。我会更新我的答案,我也会为文本颜色添加答案 keyWindowstatusBarFrame 在 iOS 13 中已弃用。

以上是关于Swift:更改 iOS 13 的状态栏颜色的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS13 上更改状态栏颜色

在 iOS 13 中更改状态栏颜色? [复制]

在iOS8中使用Swift更改特定ViewControllers的状态栏颜色

Xcode 13 - swift OS 15 中的导航栏和状态栏文本颜色变化

iOS 7隐藏导航栏时如何更改状态栏的颜色?

如何在互联网可达性上使用 ios 快速更改状态栏颜色?