[英]Change status bar background color in iOS13
使用 iOS13,我無法再更改狀態欄的背景顏色,因為無法再使用“鍵值”訪問狀態欄。 有沒有人知道這是怎么可能的,或者是否知道在 iOS13 的最終版本中它是可能的?
我已經遇到了不同的建議,例如使用 UIApplications StatusBarView(在 xcode 11,beta 7 中不再可訪問)或使用 statusbarmanager。 兩者都不允許訪問狀態欄。
let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
if statusBar.responds(to: #selector(setter: UIView.backgroundColor)) {
statusBar.backgroundColor = <Some Color>
}
我希望狀態欄能夠獲得我需要的背景顏色。
使用 UIStatusBarManager 的 Objective-C 版本:
UIView *statusBar = [[UIView alloc]initWithFrame:[UIApplication sharedApplication].keyWindow.windowScene.statusBarManager.statusBarFrame] ;
statusBar.backgroundColor = [UIColor whiteColor];
[[UIApplication sharedApplication].keyWindow addSubview:statusBar]
在您喜歡的 ViewController 上使用它
override func viewDidAppear(_ animated: Bool) {
if #available(iOS 13, *)
{
let statusBar = UIView(frame: (UIApplication.shared.keyWindow?.windowScene?.statusBarManager?.statusBarFrame)!)
statusBar.backgroundColor = UIColor.systemBackground
UIApplication.shared.keyWindow?.addSubview(statusBar)
}
}
您可以在“UIColor.systemBackground”中使用您的顏色
代碼適用於 Swift 5+ 和 iOS 13+
為了更改 StatusBar 背景顏色,我創建了 UIViewController 的基類,以便我可以在所有視圖控制器中繼承相同的代碼。
向 UIViewController 擴展添加了“statusBarColorChange()”。
extension UIViewController {
func statusBarColorChange() {
if #available(iOS 13.0, *) {
let statusBar = UIView(frame: UIApplication.shared.windows.filter {$0.isKeyWindow}.first?.windowScene?.statusBarManager?.statusBarFrame ?? CGRect.zero)
statusBar.backgroundColor = .appNavigationThemeColor
statusBar.tag = 100
UIApplication.shared.windows.filter {$0.isKeyWindow}.first?.addSubview(statusBar)
} else {
let statusBar = UIApplication.shared.value(forKeyPath: "statusBarWindow.statusBar") as? UIView
statusBar?.backgroundColor = .appNavigationThemeColor
}
} }
創建基類並在其他類中繼承。
class BaseClass: UIViewController {
override func viewWillAppear(_ animated: Bool) {
self.statusBarColorChange()
}
}
class ChatListViewController: BaseClass {}
希望會有所幫助:)
如果您不使用 NavigationController,您可以在 ViewController 中設置基本視圖背景顏色
view.backgroundColor = .blue
嘗試這個
if #available(iOS 13.0, *) {
let navBarAppearance = UINavigationBarAppearance()
navBarAppearance.configureWithOpaqueBackground()
navBarAppearance.titleTextAttributes = [.foregroundColor: UIColor.white]
navBarAppearance.largeTitleTextAttributes = [.foregroundColor: UIColor.white]
navBarAppearance.backgroundColor = <insert your color here>
navigationBar.standardAppearance = navBarAppearance
navigationBar.scrollEdgeAppearance = navBarAppearance
}
如果你有導航欄
self.navigationBar.barTintColor = UIColor.blue
or
UINavigationBar.appearance().barTintColor = UIColor.blue
如果沒有導航欄
view.backgroundColor = UIColor.blue
如果你的背景是 webview
webView.scrollView.backgroundColor = UIColor.blue
可能還有更多我遺漏的案例
let appearance = UINavigationBarAppearance()
appearance.backgroundColor = .blue
self.navigationController?.navigationBar.scrollEdgeAppearance = appearance
我希望這能幫到您。
在你的基本視圖控制器中調用它
public extension UIViewController {
func setStatusBar(color: UIColor) {
let tag = 12321
if let taggedView = self.view.viewWithTag(tag){
taggedView.removeFromSuperview()
}
let overView = UIView()
overView.frame = UIApplication.shared.statusBarFrame
overView.backgroundColor = color
overView.tag = tag
self.view.addSubview(overView)
}
}
JaspreetKour 的回答有效; 但是,重置其他視圖控制器的狀態欄顏色可能非常困難(特別是如果您需要狀態欄下方的圖像內容)。 將顏色設置為 .clear 不起作用。
一個更簡單的解決方案是清除導航欄:
navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
navigationController?.navigationBar.shadowImage = UIImage()
navigationController?.navigationBar.backgroundColor = .clear
navigationController?.navigationBar.isTranslucent = true
然后將 UIView(將背景顏色設置為您需要的顏色)添加到您的視圖控制器並將其約束設置為您的超級視圖的最頂部(而不是邊緣)。
使用這種技術,您的顏色將顯示在狀態欄下方,並且您不需要弄亂 statusBarManager(其屬性都是只讀的)。
代碼適用於 Swift 5+ 和 iOS 13+
public extension UIViewController {
func setStatusBar(color: UIColor) {
let keyWindow = UIApplication.shared.connectedScenes
.filter({$0.activationState == .foregroundActive})
.compactMap({$0 as? UIWindowScene})
.first?.windows
.filter({$0.isKeyWindow}).first
if #available(iOS 13.0, *) {
let statusBar = UIView(frame: keyWindow?.windowScene?.statusBarManager?.statusBarFrame ?? CGRect.zero)
statusBar.backgroundColor = color
statusBar.tag = 100
keyWindow?.addSubview(statusBar)
} else {
let statusBar = UIApplication.shared.value(forKeyPath: "statusBarWindow.statusBar") as? UIView
statusBar?.backgroundColor = color
}}}
我使用這個答案,但在這種情況下編譯器會生成警告
'windows' 在 iOS 15.0 中已棄用:在相關窗口場景上使用 UIWindowScene.windows
所以這段代碼工作正常。
並在您的ViewController viewDidLoad 方法中使用此方法,如下所示:
setStatusBar(color: UIColor(red: 28/255, green: 83/255, blue: 167/255, alpha: 1)) // or whatever color you want to set
我正在使用設置所有 UI 顏色的中央 ThemeManager 類。 這就是我解決它的方法。 您可以選擇適合您需要的部分解決方案:
let sharedApplication = UIApplication.shared
sharedApplication.delegate?.window??.tintColor = setYourColor
if #available(iOS 13.0, *) {
let statusBar = UIView(frame: (sharedApplication.delegate?.window??.windowScene?.statusBarManager?.statusBarFrame)!)
statusBar.backgroundColor = setYourColor
sharedApplication.delegate?.window??.addSubview(statusBar)
} else {
// Fallback on earlier versions
sharedApplication.statusBarView?.backgroundColor = setYourColor
}
extension UIApplication {
var statusBarView: UIView? {
return value(forKey: "statusBar") as? UIView
}
}
if let statusBar = UIStatusBarManager.self as? UIView {
if statusBar.responds(to: #selector(setter: UIView.backgroundColor)) {
statusBar.backgroundColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)
}
}
我希望這對你有用
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.