談談StatusBar相關的東西

先看例子

1、沒有導航欄的情況

  class ViewController: UIViewController {
    var style: UIStatusBarStyle = .default
    override var preferredStatusBarStyle: UIStatusBarStyle
    {
        print("無導航欄就會進來了。")
        return self.style
    }
    
    var changeBtn: UIButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = .purple
        let btn = UIButton.init(frame: CGRect(x: 100, y: 100, width: 100, height: 50))
        btn.backgroundColor = .gray
        self.changeBtn = btn
        btn.setTitle("hit me", for: .normal)
        btn.addTarget(self, action: #selector(click), for: .touchUpInside)
        self.view.addSubview(btn)
    }

    @objc func click() {
        // 1、沒有導航欄的情況
        if self.style == .lightContent {
            self.style = .default
        }else {
            self.style = .lightContent
        }
        setNeedsStatusBarAppearanceUpdate() // 在需要更新的時候調用 setNeedsStatusBarAppearanceUpdate() 方法來觸發它。
    }
}

此時會打印 無導航欄就會進來了。

2、有導航欄的情況
如果我們使用了導航控制器 UINavigationController, 且它的 navigationBar 沒有被隱藏,那麼會發現即使重寫 preferredStatusBarStyle 方法,這個方法也不會被調用。因爲此時狀態欄的樣式是根據導航欄的樣式來自動變換的。

@objc func click() {
    // 2、有導航欄的情況
    if let navigationBar = self.navigationController?.navigationBar {
        if navigationBar.barStyle == .default {
            navigationBar.barStyle = .black
        } else {
            navigationBar.barStyle = .default
        }
    }
}

此時不會打印 無導航欄就會進來了。

注意:上面的條件都是在info.pllist 設置
<key>UIViewControllerBasedStatusBarAppearance</key> <true/>或者不設置的情況下(跟true是一樣效果)

總結:

一、不會觸發的preferredStatusBarStyle情況:
1、<key>UIViewControllerBasedStatusBarAppearance</key>設置爲false
2、有導航欄且navigationBar沒有被隱藏

二、<key>UIViewControllerBasedStatusBarAppearance</key>設置爲false:
1、preferredStatusBarStyle不會被觸發
2、navigationBar.barStyle = .black 不起作用
3、application.statusBarStyle = .lightContent會起作用
4、在 General -> Deployment Info 中,將 Status Bar Style 設置成 Light會起作用(3優先4)
三、<key>UIViewControllerBasedStatusBarAppearance</key>設置爲true:
與總結二反之

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章