1、获取状态栏高度
func statusBarHeight() -> CGFloat {
var statusBarHeight: CGFloat = 44
if #available(iOS 13.0, *) {
let window = UIApplication.shared.windows.first
statusBarHeight = window?.safeAreaInsets.top ?? 0
} else {
statusBarHeight = UIApplication.shared.statusBarFrame.height
}
return statusBarHeight
}
func isIPhoneX() -> Bool {
return statusBarHeight() == 20 ? false : true
}
2、改变状态栏背景颜色
override func viewWillAppear(_ animated: Bool) {
let statusView = statusBarUIView();
statusView?.backgroundColor = UIColor.red;
}
// 获取状态栏背景视图
func statusBarUIView() -> (UIView?) {
if #available(iOS 13,*) {
let tag = 128901;
guard let window = UIApplication.shared.delegate?.window else {
return nil;
}
if let statusView = window?.viewWithTag(tag) {
// 已经添加
window?.bringSubviewToFront(statusView);
return statusView;
} else {
// 未添加,现在添加
let statusHeight = isIphoneX() ? 44 : 20;
let statusBarRect = CGRect(x: 0, y: 0, width: Int(UIScreen.main.bounds.width), height: statusHeight);
let statusBarView = UIView(frame: statusBarRect);
statusBarView.tag = tag;
window?.addSubview(statusBarView);
return statusBarView;
}
} else {
// 状态栏
let statusWindow = UIApplication.shared.value(forKey: "statusBarWindow") as! UIView;
let statusBar = statusWindow.value(forKey:"statusBar") as! UIView;
return statusBar;
}
}
还有这种通修改导航栏背景图片和颜色,达到修改状态栏背景一样的效果。但这种方式并不是修改的状态栏,若隐藏导航就会原形毕露。
导航栏的背景颜色
self.navigationController?.navigationBar.barTintColor = UIColor.blue;
导航栏的背景图片
self.navigationController?.navigationBar.setBackgroundImage(UIImage(named: "guide1.jpg"), for: .any, barMetrics: .`default`);
3、改变状态栏文字颜色
没导航或导航已经隐藏的情况
// 样式
var style: UIStatusBarStyle = .lightContent; // .default
// 修改样式后可以主动触发来更新状态栏样式
setNeedsStatusBarAppearanceUpdate();
// 重写statusBar相关方法
override var preferredStatusBarStyle: UIStatusBarStyle {
return self.style
}
有导航栏时
这种方式导航栏的标题也会跟着改变颜色
let navigationBar = self.navigationController?.navigationBar;
navigationBar?.barStyle = .black; // .default
self.navigationController?.navigationBar.barTintColor = UIColor.blue;