【问题标题】:Update UI when toggle between darkmode and lightmode then enter foreground在暗模式和亮模式之间切换时更新 UI,然后进入前景
【发布时间】: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


【解决方案1】:

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

这工作完美!

【讨论】:

    猜你喜欢
    • 2020-08-24
    • 2021-09-12
    • 2021-05-30
    • 2021-03-05
    • 2020-10-20
    • 1970-01-01
    • 2021-04-02
    • 2021-12-30
    • 1970-01-01
    相关资源
    最近更新 更多