iOS 13 黑暗模式:traitCollectionDidChange 只在第一次调用

non*_*tic 7 collections traits ios swift

我的应用程序使用自定义颜色主题,但 iOS13 用户可以选择以下深色模式。

我以为我可以简单地更新我的颜色,ViewController's traitCollectionDidChange()但由于某种原因,这个函数只在用户第一次更改 iOS 设置中的界面样式时调用。虽然这对大多数用户来说可能已经足够了,但理想情况下,traitCollectionDidChange()每次用户更改其 iOS 设置时都应调用。

只是非常基本的:

override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
  super.traitCollectionDidChange(previousTraitCollection)
  print(#function)

  guard traitCollection.userInterfaceStyle != previousTraitCollection?.userInterfaceStyle else { return }

  NotificationCenter.default.post(name: NSNotification.Name(Keys.Notifications.updateColorTheme), object: nil)
}
Run Code Online (Sandbox Code Playgroud)

我启动我的应用程序,离开它,在 iOS 设置中更改外观:下次我打开应用程序(打开,不启动)时,上述函数被调用,应用程序更新颜色。现在,当我重复相同的过程时,不再调用该函数。

fra*_*ank 5

我发现如果我设置 UIViewController 的overrideUserInterfaceStyle属性,则traitCollectionDidChange不会调用该方法,但是当我不设置此overrideUserInterfaceStyle属性时,则会traitCollectionDidChange调用该方法。

也许UIKit中有一些基于overrideUserInterfaceStyle属性的内部方法调用判断。

希望这有帮助。