我经常使用的一个解决方案是创建一个基本视图控制器类,我的应用程序中的所有视图控制器都从该类派生。这具有允许使用具有默认(浅色或深色)样式的基于视图控制器的状态栏样式设置功能的优点,然后可以根据需要在每个视图控制器的基础上覆盖该样式。
一旦您开始了解基于 trait-collection 的更改、大多数视图控制器想要的自定义过渡动画、分析跟踪的中心点以及其他有用的东西,基本视图控制器也非常方便。
是的,您必须检查您可能很大的源代码库并将所有UIViewController
s 更改为BaseViewController
s,但这通常与全局搜索和替换一样简单。
以下是BaseViewController
状态栏相关方法的外观:
class BaseViewController: UIViewController {
var statusBarHidden: Bool = false { didSet { setNeedsStatusBarAppearanceUpdate() } }
var statusBarStyle: UIStatusBarStyle = .lightContent { didSet { setNeedsStatusBarAppearanceUpdate() } }
var statusBarUpdateAnimation: UIStatusBarAnimation = .fade { didSet { setNeedsStatusBarAppearanceUpdate() } }
override var preferredStatusBarStyle: UIStatusBarStyle { return statusBarStyle }
override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation { return statusBarUpdateAnimation }
override var prefersStatusBarHidden: Bool { return statusBarHidden }
}
对于所有使用默认灯光样式的视图控制器,你不需要做任何特别的事情:
class ViewController: BaseViewController { }
如果您需要深色状态栏,请执行以下操作:
class DarkStatusBarViewController: BaseViewController {
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
statusBarStyle = .default
}
}
另请注意,您可以将DarkStatusBarViewController
上述内容重命名为DarkStatusBarBaseViewController
并从中派生,而不是BaseViewController
在需要深色状态栏时。然后,您不需要在每个需要它的视图控制器中复制状态条码,并且您可以为所有BaseViewController
功能保持良好的线性关系。