在iOS13中更改状态栏背景颜色

时间:2019-08-30 12:00:56

标签: ios objective-c statusbar 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>
}

我希望状态栏能够获得所需的背景颜色。

11 个答案:

答案 0 :(得分:4)

在首选的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”中使用颜色

答案 1 :(得分:3)

如果您不使用NavigationController,则可以在ViewController中设置基本视图的背景颜色

view.backgroundColor = .blue

答案 2 :(得分:2)

使用UIStatusBarManager的目标C版本:

UIView *statusBar = [[UIView alloc]initWithFrame:[UIApplication sharedApplication].keyWindow.windowScene.statusBarManager.statusBarFrame] ;
statusBar.backgroundColor = [UIColor whiteColor];
[[UIApplication sharedApplication].keyWindow addSubview:statusBar]

答案 3 :(得分:1)

状态栏将尝试匹配应用程序的颜色

如果您有导航栏

self.navigationBar.barTintColor = UIColor.blue

or

UINavigationBar.appearance().barTintColor = UIColor.blue

如果没有导航栏

view.backgroundColor = UIColor.blue

如果您的背景是网络视图

webView.scrollView.backgroundColor = UIColor.blue

我可能还有更多的失踪案

答案 4 :(得分:1)

代码适用于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 {} 

希望会有所帮助:)

答案 5 :(得分:0)

 let appearance = UINavigationBarAppearance()
 appearance.backgroundColor = .blue
 self.navigationController?.navigationBar.scrollEdgeAppearance = appearance

我希望这会对您有所帮助。

答案 6 :(得分:0)

尝试一下

import API from "../../utils/API";

componentDidMount() {
let merchantId = this.props.merchant.id;
let api = new API(this.props.gatheredTokens);
let self = this;
api.setRetry(10);
api
  .get("merchantMessages", { repl_str: merchantId })
  .then(response => this.merchantMessageConfiguration(response.data))
  .catch(function (error) {
    console.log(error);
  })
  .then(function () {
    self.state.list.push(
      <Card
        merchant={self.props.merchant}
        key={self.props.merchant.id}
        bubblemsg={self.state.bubblemsg}
      />
    );
  })
  .then(function () {
    self.merchantNoticeLoading(self);
  });
 }

答案 7 :(得分:0)

在基本视图控制器中调用此

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

答案 8 :(得分:0)

我正在使用中央ThemeManager类,在其中设置所有UI颜色。这就是我解决的方法。您可以选择满足您需求的部分解决方案:

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

答案 9 :(得分:0)

JaspreetKour 的回答有效;但是,为其他视图控制器重置状态栏颜色可能非常困难(特别是如果您需要状态栏下方的图像内容)。将颜色设置为 .clear 不起作用。

一个更简单的解决方案是清除导航栏:

navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
navigationController?.navigationBar.shadowImage = UIImage()
navigationController?.navigationBar.backgroundColor = .clear
navigationController?.navigationBar.isTranslucent = true

然后向视图控制器添加一个 UIView(将背景颜色设置为您需要的颜色)并将其约束设置为超级视图的最顶部(而不是边距)。

使用这种技术,您的颜色将显示在状态栏下方,您无需弄乱 statusBarManager(其属性都是只读的)。

答案 10 :(得分:-2)

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

我希望这对您有用