我有一个如下所示的登录屏幕:
基本上,我想进行以下设置:在此登录屏幕中->输入背景->在设置中切换暗模式或亮模式->输入前景,dropShadowView
及其元素会相应更改。下面是我的代码:
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-> exp的darkmode)更改后,在行if traitCollection.userInterfaceStyle == .dark {
上,最初并不能识别当前的userInterfaceStyle
(与系统的背景颜色)。
我的应用程序的目标低于iOS 11,因此我在使用颜色集时也遇到了一些问题。
问题是在进入前景时是否有可能的方式以编程方式为暗模式更新UI?
谢谢。
答案 0 :(得分:0)
问题已解决。我使用了自定义颜色,并且UI会自动更新: How do I easily support light and dark mode with a custom color used in my app?
它应该像这样:
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
}
}
}
这很完美!