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
【讨论】:
他不想改变背景,而是状态栏的文字 是的,但是请阅读他编写的代码,这是关于背景的。我会更新我的答案,我也会为文本颜色添加答案keyWindow
和 statusBarFrame
在 iOS 13 中已弃用。以上是关于Swift:更改 iOS 13 的状态栏颜色的主要内容,如果未能解决你的问题,请参考以下文章
在iOS8中使用Swift更改特定ViewControllers的状态栏颜色