iOS状态栏设置

  • 默认启动页的status
  • 默认的viewController状态栏

一. 状态栏显示和隐藏

1.1 启动页

启动页隐藏StatusBar(默认为NO): Status bar is initially hidden = YES

ios rn 设置顶部状态栏 iphonexr顶部状态栏设置_ios rn 设置顶部状态栏

1.2 普通viewController

普通的viewController:View controller-based status bar appearance = NO

ios rn 设置顶部状态栏 iphonexr顶部状态栏设置_状态栏隐藏_02


注意:设置为NO后,导航控制器会向上移动

1.3 有NavigationController

只有设置了Status bar is initially hidden = YES后, View controller-based status bar appearance的设置才有效.

1.4 手动设置隐藏

  1. 在info.plist里面:View controller-based status bar appearance = NO
  2. 全局设置: UIApplication.shared.isStatusBarHidden = true(iOS9过期了)

1.5 局部设置隐藏

  1. 在info.plist里面:View controller-based status bar appearance = YES
  2. 在需要隐藏的控制器里面
override var prefersStatusBarHidden: Bool{
        return true
    }

二. 颜色设置

2.1 普通的viewController

override var preferredStatusBarStyle: UIStatusBarStyle{
        return .lightContent;//你想设置的颜色
    }

2.2 有NavigationController

  • 在有导航控制器的时候,上面设置是没有用的, 因为导航控制器也有控制statusBar的权利.

2.2.1 方法一:以topVC的为准,没有就返回默认的

//MyNavigationController.swift
override var preferredStatusBarStyle: UIStatusBarStyle{
        return topViewController?.preferredStatusBarStyle ?? .default
    }

//--------------------------------

//MyViewController.swift
  override var preferredStatusBarStyle: UIStatusBarStyle{
        return .lightContent;//你想设置的颜色
    }

效果如下:

ios rn 设置顶部状态栏 iphonexr顶部状态栏设置_状态栏隐藏_03

2.2.2 方法二: 通过拿到导航控制器设置

navigationController?.navigationBar.barStyle = .black//你想设置的样式
//样式枚举如下
public enum UIBarStyle : Int {
    case `default`
    case black
    public static var blackOpaque: UIBarStyle { get } // Deprecated. Use UIBarStyleBlack
    case blackTranslucent // Deprecated. Use UIBarStyleBlack and set the translucent property to YES
}

ios rn 设置顶部状态栏 iphonexr顶部状态栏设置_iOS_04


ios rn 设置顶部状态栏 iphonexr顶部状态栏设置_ios rn 设置顶部状态栏_05


ios rn 设置顶部状态栏 iphonexr顶部状态栏设置_状态栏设置_06


ios rn 设置顶部状态栏 iphonexr顶部状态栏设置_状态栏_07

三. 状态栏背景色设置

3.1 状态栏很大程度上依赖于导航栏的设置

  • 无导航栏时: 默认是透明的
  • 有导航栏时: 默认是导航栏的颜色
  • 设置导航栏的颜色
navigationController?.navigationBar.barTintColor = UIColor.red

效果如下:

ios rn 设置顶部状态栏 iphonexr顶部状态栏设置_状态栏_08

3.2 KVC强制设置状态栏的颜色:设置状态栏背景色,有点暴力,这样所有状态栏的的背景色都会改变.

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

ios rn 设置顶部状态栏 iphonexr顶部状态栏设置_ios rn 设置顶部状态栏_09

三. 总结一下

  • 一般需求变化是多样的,没有一成不变的状态栏,所以在设置的时候尽量考虑会变的情况,将状态栏的设置交给当前控制器:
  1. 在info.plist添加下面两个状态:

View controller-based status bar appearance = YES

Status bar is initially hidden = YES

ios rn 设置顶部状态栏 iphonexr顶部状态栏设置_状态栏_10

  1. 自定义导航控制器里面重载系统设置状态栏样式方法:
//MyNavigationController.swift
  override var preferredStatusBarStyle: UIStatusBarStyle{
          return topViewController?.preferredStatusBarStyle ?? .default
      }
  1. 在自己的控制器里面做显示隐藏控制,颜色控制
/// 显示或隐藏
  override var prefersStatusBarHidden: Bool{
      return true
  }
  ///显示样式
  override var preferredStatusBarStyle: UIStatusBarStyle{
      return .lightContent;
  }