在Swift 3中更改状态栏背景颜色

der*_*ida 52 statusbar ios uistatusbar swift swift3

在XCode 7.3.x中,我使用以下命令更改了StatusBar的背景颜色:

func setStatusBarBackgroundColor(color: UIColor) {
guard  let statusBar = UIApplication.sharedApplication().valueForKey("statusBarWindow")?.valueForKey("statusBar") as? UIView else {
    return
}
statusBar.backgroundColor = color
}
Run Code Online (Sandbox Code Playgroud)

但似乎这不再适用于Swift 3.0.

我尝试过:

func setStatusBarBackgroundColor(color: UIColor) {
guard  let statusBar = (UIApplication.shared.value(forKey: "statusBarWindow") as AnyObject).value(forKey: "statusBar") as? UIView else {
    return
}
statusBar.backgroundColor = color
}
Run Code Online (Sandbox Code Playgroud)

但它给了我:

this class is not key value coding-compliant for the key statusBar.
Run Code Online (Sandbox Code Playgroud)

任何想法如何使用XCode8/Swift 3.0进行更改?

Cal*_*lam 141

extension UIApplication {
    var statusBarView: UIView? {
        if responds(to: Selector(("statusBar"))) {
            return value(forKey: "statusBar") as? UIView
        }
        return nil
    }
}

UIApplication.shared.statusBarView?.backgroundColor = .red
Run Code Online (Sandbox Code Playgroud)

  • 这根本不是一个好习惯,我非常不鼓励使用这种方法,因为这个'UIView`是私有的.我很想知道您的应用是否获得批准使用此功能. (15认同)
  • @SanketBhavsar我还没有拒绝使用它 (5认同)
  • @breaktop使用`value(forKey key:String)`方法,您正在使用objc运行时的KVC来访问您在运行时期间无法访问的视图(并且没有文档引用它BTW).这种结构在iOS 10下使用,但不是在iOS 9下使用(你首先需要访问`statusBarWindow`),你绝对不知道它会在iOS 11下持续存在.内部结构和没有文档意味着Apple在此没有任何合同要尊重. (3认同)
  • 我在iPhone X上遇到此方法的问题.当激活应用程序切换器(主页指示器)手势时,背景颜色变为透明. (2认同)

Dan*_*cas 51

"更改"状态栏背景颜色:

let statusBarView = UIView(frame: UIApplication.shared.statusBarFrame)
let statusBarColor = UIColor(red: 32/255, green: 149/255, blue: 215/255, alpha: 1.0)
statusBarView.backgroundColor = statusBarColor
view.addSubview(statusBarView)
Run Code Online (Sandbox Code Playgroud)

更改状态栏文字颜色:

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}
Run Code Online (Sandbox Code Playgroud)

更新:请注意,旋转视图时状态栏框架将更改.您可以通过以下方式更新创建的子视图框架:

  • 使用自动调整掩码: statusBarView.autoresizingMask = [.flexibleWidth, .flexibleTopMargin]
  • 观察 NSNotification.Name.UIApplicationWillChangeStatusBarOrientation
  • 或压倒一切 viewWillLayoutSubviews()


abd*_*lek 29

使用Swift 3和4,您可以使用下面的代码片段.它UIApplication使用valueForKeyPath设置它的背景颜色来查找视图.

guard let statusBarView = UIApplication.shared.value(forKeyPath: "statusBarWindow.statusBar") as? UIView else {
        return
    }
statusBarView.backgroundColor = UIColor.red
Run Code Online (Sandbox Code Playgroud)

Objective-C的

UIView *statusBarView = [UIApplication.sharedApplication valueForKeyPath:@"statusBarWindow.statusBar"];
if (statusBarView != nil)
{
    statusBarView.backgroundColor = [UIColor redColor];
}
Run Code Online (Sandbox Code Playgroud)


Jam*_*mim 8

对于Xcode 9和iOS 11: 我们将尝试实现的状态栏样式是带有白色内容的状态栏。转到ViewController.swift文件并添加以下代码行。

override var preferredStatusBarStyle: UIStatusBarStyle {

     return .lightContent

}
Run Code Online (Sandbox Code Playgroud)

或从项目设置选项中,您可以更改状态栏的样式:

在此处输入图片说明

接下来,返回到情节提要,选择“视图控制器”,然后在“编辑器”菜单中选择“嵌入到导航控制器中”。选择导航栏,然后在“属性检查器”中将“栏色调”颜色设置为红色。故事板将如下所示。 在此处输入图片说明

生成并运行项目,状态栏的内容再次变暗,这是默认设置。原因是,iOS要求导航控制器的状态栏样式,而不是所包含的视图控制器。

在此处输入图片说明

要更改应用程序内部所有导航控制器的样式,请在AppDelegate.swift文件中更改以下方法。

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    UINavigationBar.appearance().barStyle = .blackOpaque
    return true
    }
Run Code Online (Sandbox Code Playgroud)

再次生成并运行项目,这一次状态栏的内容变为白色。

在此处输入图片说明


Fre*_*der 7

我有一个自定义解决方案,用于在 iOS 13 及更低版本上更改状态栏。以下是如何做到这一点:

if #available(iOS 13.0, *) {
   let app = UIApplication.shared
   let statusBarHeight: CGFloat = app.statusBarFrame.size.height

   let statusbarView = UIView()
   statusbarView.backgroundColor = UIColor.red
   view.addSubview(statusbarView)

   statusbarView.translatesAutoresizingMaskIntoConstraints = false
   statusbarView.heightAnchor
     .constraint(equalToConstant: statusBarHeight).isActive = true
   statusbarView.widthAnchor
     .constraint(equalTo: view.widthAnchor, multiplier: 1.0).isActive = true
   statusbarView.topAnchor
     .constraint(equalTo: view.topAnchor).isActive = true
   statusbarView.centerXAnchor
     .constraint(equalTo: view.centerXAnchor).isActive = true

} else {
      let statusBar = UIApplication.shared.value(forKeyPath: 
   "statusBarWindow.statusBar") as? UIView
      statusBar?.backgroundColor = UIColor.red
}
Run Code Online (Sandbox Code Playgroud)

要旨

另外,请查看文章iOS 13 如何更改状态栏颜色?

最后一件事,您仍然可以使用以下命令更改状态栏样式:

 override var preferredStatusBarStyle : UIStatusBarStyle {
    return UIStatusBarStyle.lightContent
    //return UIStatusBarStyle.default   // Make dark again
}
Run Code Online (Sandbox Code Playgroud)


小智 5

对于iOS 11和Xcode 9,请使用以下步骤.

  1. 创建UIApplication类的扩展:

    extension UIApplication { var statusBarView: UIView? { return value(forKey: "statusBar") as? UIView } }

  2. 在您的班级或您想要更改状态栏的背景颜色的任何位置:

    UIApplication.shared.statusBarView?.backgroundColor = .red

  3. 对于状态栏的轻量级内容或暗内容,只需转到Info.plist并添加值为NO的以下值行.

查看基于控制器的状态栏外观

  1. 现在只需在项目设置的" 常规"选项卡中设置光照内容或任何需要的内容.