状态栏样式修改

iOS9之后全局动态修改StatusBar样式

  1. 局部修改StatusBar样式
    最常用的方法是通过控制器来修改StatusBar样式
    1
    2
    3
    override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
    }

注意:如果当前控制器有导航控制器,需要在导航控制器中这样设置(如下代码),不然不起作用.

1
2
3
override var preferredStatusBarStyle: UIStatusBarStyle {
return topViewController?.preferredStatusBarStyle ?? .default
}

这样做的好处是,可以针对不同的控制器设置不同的StatusBar样式,但有时往往会多此一举,略嫌麻烦,那如何全局统一处理呢?


  1. iOS9之前全局修改StatusBar样式
    iOS9之前的做法比较简单,在plist文件中设置View controller-based status bar appearance为NO.

在需要设置的地方添加

UIApplication.shared.setStatusBarStyle(.default, animated: true)
这样全局设置StatusBar样式就可以了,但iOS9之后setStatusBarStyle方法被废弃了,苹果推荐使用preferredStatusBarStyle,也就是上面那种方法.


  1. iOS9之后全局修改StatusBar样式
    我们可以用UIAppearance和导航栏的barStyle去全局设置StatusBar的样式.

UIAppearance属性可以做到全局修改样式.

导航栏的barStyle决定了NavigationBar的外观,而barStyle属性改变会联动到StatusBar的样式.

当barStyle = .default,表示导航栏的为默认样式,StatusBar的样式为了和导航栏区分,就会变成黑色.
当barStyle = .black,表示导航栏的颜色为深黑色,StatusBar的样式为了和导航栏区分,就会变成白色.
这个有点绕,总之就是StatusBar的样式和导航栏的样式反着来.

具体实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@IBAction func segmentedControl(_ sender: UISegmentedControl) {

switch sender.selectedSegmentIndex {
case 0:
// StatusBar为黑色,导航栏颜色为白色
UINavigationBar.appearance().barStyle = .default
UINavigationBar.appearance().barTintColor = UIColor.white
default:
// StatusBar为白色,导航栏颜色为深色
UINavigationBar.appearance().barStyle = .black
UINavigationBar.appearance().barTintColor = UIColor.darkNight
}

// 刷新window下的子控件
UIApplication.shared.windows.forEach {
$0.reload()
}
}

public extension UIWindow {
func reload() {
subviews.forEach { view in
view.removeFromSuperview()
addSubview(view)
}
}
}