关闭暗黑模式
先分享下如何关闭暗黑模式,因为一旦关闭暗黑模式,暗黑模式的所有回调都不会触发。
MBDNavigationController
override init(rootViewController: UIViewController) {
super.init(rootViewController: rootViewController)
//关闭暗黑模式
if #available(iOS 13.0, *) {
//统一使用白色模式
self.overrideUserInterfaceStyle = UIUserInterfaceStyle.light
} else {
// Fallback on earlier versions
}
}
模式切换回调
任何 Controller 或者 View 或者 Cell
回调方法
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
}
弊端
每个 view 或者 cell 都要复写这个回调方法
最佳实践
Base View Controller
在 BaseViewController 中实现该方法:
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
if #available(iOS 13.0, *) {
if traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) {
updateColors()
}
} else {
// Fallback on earlier versions
}
}
func updateColors() {
view.setDynamicBackgroundColor()
// 子类可以重写此方法来更新特定的UI元素
}
View Controller
子 Controller 中复写 updateColors 方法即可。比如:
override func updateColors() {
tableView.setDynamicBackgroundColor()
searchBar.setDynamicSearchBarBackgroundColor()
// 遍历并更新 cellModels
if let cellModels = self.viewModel.cellModels {
for i in 0..<cellModels.count {
let updatedGroupDetail = cellModels[i].groupDetail
// 重新设置 groupDetail
self.viewModel.cellModels?[i].groupDetail = updatedGroupDetail
}
}
self.tableView.reloadData()
}