ios - 在暗模式和亮模式之间切换时更新 UI,然后进入前景
问题描述
我有一个如下所示的登录屏幕:
基本上,我想设置,以便在执行以下操作后:在此登录屏幕中时 -> 进入背景 -> 在设置中切换暗模式或亮模式 - > 进入前景,dropShadowView
其元素会相应更改。下面是我的代码:
- 在 viewDidLoad() 中:
override func viewDidLoad() {
super.viewDidLoad()
setupForDarkmode()
NotificationCenter.default.addObserver(self, selector: #selector(willEnterForeground), name: UIApplication.willEnterForegroundNotification, object: nil)
}
- 和功能:
@objc func willEnterForeground() {
setupForDarkmode()
}
private func setupForDarkmode() {
if #available(iOS 13.0, *) {
overrideUserInterfaceStyle = .unspecified
if traitCollection.userInterfaceStyle == .dark {
dropShadowView.backgroundColor = .black
userNameTextField.backgroundColor = .black
userNameTextField.textColor = .white
passwordTextField.backgroundColor = .black
passwordTextField.textColor = .white
} else {
dropShadowView.backgroundColor = .white
userNameTextField.backgroundColor = .gray
userNameTextField.textColor = .blue
passwordTextField.backgroundColor = .gray
passwordTextField.textColor = .blue
}
}
}
- 屏幕的背景已经设置为系统的背景颜色。
然而,上面的这些代码并没有像我预期的那样工作。在设置更改后第一次进入前台时,dropShadowView
其及其元素保持其外观直到第二次。
经过一段时间的调试,我发现在设置更改后(lightmode -> darkmode for exp),在 line 处if traitCollection.userInterfaceStyle == .dark {
,它最初未被识别为当前userInterfaceStyle
(与系统的背景颜色不同)。
我的应用程序的目标低于 iOS 11,所以我也有一些使用 colorset 的问题。
问题是在进入前台时是否有可能以编程方式更新黑暗模式的 UI?
提前致谢。
解决方案
问题已经解决了。我使用了自定义颜色并且 UI 自动更新: 如何使用我的应用程序中使用的自定义颜色轻松支持明暗模式?
它应该如下所示:
extension UIColor {
static var dropShadowViewBackground: UIColor {
if #available(iOS 13.0, *) {
return UIColor { (traits) -> UIColor in
// Return one of two colors depending on light or dark mode
return traits.userInterfaceStyle == .dark ? .black : .white
}
} else {
// Same old color used for iOS 12 and earlier
return .white
}
}
}
这工作完美!