【发布时间】:2020-06-05 14:13:25
【问题描述】:
我有一个如下所示的登录屏幕:
基本上,我想设置,以便在执行以下操作后:在此登录屏幕中时 -> 进入背景 -> 在设置中切换暗模式或亮模式 -> 进入前景,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),在if traitCollection.userInterfaceStyle == .dark { 行,最初无法识别当前userInterfaceStyle(与系统的背景颜色不同)。
我的应用程序的目标低于 iOS 11,所以我在使用颜色集时也遇到了一些问题。
问题是在进入前台时是否有可能以编程方式为暗模式更新 UI?
提前致谢。
【问题讨论】:
-
只是为了调试把你的
setupForDarkMode()改成DispatchQueue.main.asyncAfter(deadline: .now()+2.0) { setupForDarkmode() }里面willEnterForeground()看看它是否有效 -
如果您使用动态颜色,那么 UI 将自动更新。请参阅 stackoverflow.com/questions/56487679/… 和 WWDC 2019 会议关于采用暗模式
-
@Paulw11 感谢您的建议!我会试试这个。
标签: ios swift user-interface foreground ios-darkmode