首页 > 解决方案 > 在暗模式和亮模式之间切换时更新 UI,然后进入前景

问题描述

我有一个如下所示的登录屏幕:

基本上,我想设置,以便在执行以下操作后:在此登录屏幕中时 -> 进入背景 -> 在设置中切换暗模式或亮模式 - > 进入前景,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 -> darkmode for exp),在 line 处if traitCollection.userInterfaceStyle == .dark {,它最初未被识别为当前userInterfaceStyle(与系统的背景颜色不同)。

我的应用程序的目标低于 iOS 11,所以我也有一些使用 colorset 的问题。

问题是在进入前台时是否有可能以编程方式更新黑暗模式的 UI?

提前致谢。

标签: iosswiftuser-interfaceforegroundios-darkmode

解决方案


问题已经解决了。我使用了自定义颜色并且 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
        }
    }
}

这工作完美!


推荐阅读