簡體   English   中英

在 iOS13 中更改狀態欄背景顏色

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM