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



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

应用程序有设置,用户可以在其中设置显示主题(浅色深色系统默认(,如果用户选择主题后应用程序重新启动,当前它可以正常工作(我将此布尔数据保存在UserDefaults中,并在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
}
}

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

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

我试图通过在ViewWillAppear上设置基本视图控制器和用户界面样式来做到这一点,但导航栏&选项卡栏外观不变。

有人能告诉我怎么处理吗?谢谢

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

您只需要使用通知观察器模式在用户交互时调用代码,或者直接调用函数。

但重点是访问可见窗口和那里的overrideUserInterfaceStyle。因此,例如,您可以从任何可见的view设置它,如:

view.window?.overrideUserInterfaceStyle = .dark

不推荐但工作方法

// 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的一部分,您应该从sceneDelegate 访问它

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

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

我希望这将帮助其他

最新更新