iOS状态栏设置
- 默认启动页的status
- 默认的viewController状态栏
一. 状态栏显示和隐藏
1.1 启动页
启动页隐藏StatusBar(默认为NO): Status bar is initially hidden = YES
1.2 普通viewController
普通的viewController:View controller-based status bar appearance = NO
注意:设置为NO后,导航控制器会向上移动
1.3 有NavigationController
只有设置了Status bar is initially hidden = YES后, View controller-based status bar appearance的设置才有效.
1.4 手动设置隐藏
- 在info.plist里面:View controller-based status bar appearance = NO
- 全局设置: UIApplication.shared.isStatusBarHidden = true(iOS9过期了)
1.5 局部设置隐藏
- 在info.plist里面:View controller-based status bar appearance = YES
- 在需要隐藏的控制器里面
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;//你想设置的颜色
}
效果如下:
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
}
三. 状态栏背景色设置
3.1 状态栏很大程度上依赖于导航栏的设置
- 无导航栏时: 默认是透明的
- 有导航栏时: 默认是导航栏的颜色
- 设置导航栏的颜色
navigationController?.navigationBar.barTintColor = UIColor.red
效果如下:
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
}
三. 总结一下
- 一般需求变化是多样的,没有一成不变的状态栏,所以在设置的时候尽量考虑会变的情况,将状态栏的设置交给当前控制器:
- 在info.plist添加下面两个状态:
View controller-based status bar appearance = YES
Status bar is initially hidden = YES
- 自定义导航控制器里面重载系统设置状态栏样式方法:
//MyNavigationController.swift
override var preferredStatusBarStyle: UIStatusBarStyle{
return topViewController?.preferredStatusBarStyle ?? .default
}
- 在自己的控制器里面做显示隐藏控制,颜色控制
/// 显示或隐藏
override var prefersStatusBarHidden: Bool{
return true
}
///显示样式
override var preferredStatusBarStyle: UIStatusBarStyle{
return .lightContent;
}