Swift优化
switch中判断枚举类型,尽量避免使用default
通过switch
语句来判断枚举类型,不使用default
,如果后期添加新的枚举类型,而忘记在switch
中处理,会报错,这样可以提高代码的健壮性.
iOS9之后全局动态修改StatusBar样式
1. 局部修改StatusBar样式
最常用的方法是通过控制器来修改StatusBar
样式
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
注意:如果当前控制器有导航控制器,需要在导航控制器中这样设置(如下代码),不然不起作用.
override var preferredStatusBarStyle: UIStatusBarStyle {
return topViewController?.preferredStatusBarStyle ?? .default
}
这样做的好处是,可以针对不同的控制器设置不同的StatusBar
样式,但有时往往会多此一举,略嫌麻烦,那如何全局统一处理呢?
3. iOS9之后全局修改StatusBar样式
我们可以用UIAppearance
和导航栏的barStyle
去全局设置StatusBar
的样式.
-
UIAppearance
属性可以做到全局修改样式. -
导航栏的
barStyle
决定了NavigationBar
的外观,而barStyle
属性改变会联动到StatusBar
的样式.- 当
barStyle = .default
,表示导航栏的为默认样式,StatusBar
的样式为了和导航栏区分,就会变成黑色. - 当
barStyle = .black
,表示导航栏的颜色为深黑色,StatusBar
的样式为了和导航栏区分,就会变成白色.
这个有点绕,总之就是
StatusBar
的样式和导航栏的样式反着来. - 当
具体实现:
@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()
}
}
extension UIWindow {
func reload() {
subviews.forEach { view in
view.removeFromSuperview()
addSubview(view)
}
}
}
4. 怎么根据导航栏颜色自动修改StatusBar样式
在修改导航栏颜色的时候,判断下导航栏颜色的深浅
extension UIColor {
func isDarkColor() -> Bool {
var w: CGFloat = 0
self.getWhite(&w, alpha: nil)
return w > 0.5 ? false : true
}
}
热门相关:地球第一剑 网游之逆天飞扬 夫人,你马甲又掉了! 战神 最强装逼打脸系统