如何在iOS 13中的Swift中立即更改主题样式(用户界面样式)

时间:2019-10-28 10:00:39

标签: ios swift ios-darkmode

我正在使用Swift 5.1和Xcode 11.1,目前已经完成了黑暗模式设计。

应用程序已进行设置,用户可以在其中设置显示主题(深色系统默认),并且如果应用程序在重启后重新启动,则目前可以正常使用用户选择主题(我将这些布尔数据保存在UserDefaults中,并在App启动时在AppDelegate文件中设置UIAppearance)

这是我的代码

if #available(iOS 13.0, *) {
   switch AppState.appThemeStyle {
   case "dark":
       window?.overrideUserInterfaceStyle = .dark
       break
   case "light":
       window?.overrideUserInterfaceStyle = .light
       break
   default:
       window?.overrideUserInterfaceStyle = .unspecified
   }
}

但是我看到许多应用在用户设置主题样式后立即更改显示主题。

我认为重启应用程序不是一个好主意,因为仅更改主题并且用户设置主题样式后应立即更改主题。

我试图通过设置基本的viewcontroller并在ViewWillAppear上设置用户界面样式来做到这一点,但是导航栏和Tab栏的外观没有改变。

有人可以告诉我如何处理吗? 谢谢。

2 个答案:

答案 0 :(得分:2)

此代码是即时代码,无需重新启动应用程序!

您只需要在与通知观察者模式进行用户交互时调用代码,或直接调用如下函数:

// Because you are using AppDelegate for this: (But it is going to be deprecated. read the following Note)
(UIApplication.shared.delegate as! AppDelegate).myFunctionThatChangesTheUserInterfaceStyle()

请注意:自iOS 13起,键窗口不再是appDelegate的一部分,您应该access it from sceneDelegate

答案 1 :(得分:1)

我们可以通过设置overlayUserInterfaceStyle来立即更改用户界面样式。 我添加了此代码,用户可以在其中选择主题样式。

guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
   return
}
appDelegate.changeTheme(themeVal)

我希望这会帮助其他人