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的样式.

    1. barStyle = .default,表示导航栏的为默认样式,StatusBar的样式为了和导航栏区分,就会变成黑色.
    2. 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
    }
}

热门相关:地球第一剑