在暗模式和亮模式之间切换时更新UI,然后进入前景

时间:2020-02-21 07:10:55

标签: ios swift user-interface foreground ios-darkmode

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

基本上,我想进行以下设置:在此登录屏幕中->输入背景->在设置中切换暗模式或亮模式->输入前景,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-> exp的darkmode)更改后,在行if traitCollection.userInterfaceStyle == .dark {上,最初并不能识别当前的userInterfaceStyle(与系统的背景颜色)。

我的应用程序的目标低于iOS 11,因此我在使用颜色集时也遇到了一些问题。

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

谢谢。

1 个答案:

答案 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
        }
    }
}

这很完美!