在iOS13中Swift如何立即改变主题风格(User Interface Style)
How to change theme style (User Interface Style) immediately in Swift in iOS 13
我正在使用 Swift 5.1 和 Xcode 11.1,目前我已经完成 暗模式 设计。
应用程序具有用户可以设置显示主题的设置(浅色、深色、系统默认值) 目前,如果应用程序在用户选择主题后重新启动,它工作正常(我将此 bool 数据保存在 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
}
}
但我看到很多应用在用户设置主题样式后立即更改显示主题。
我认为只更改主题重启应用不是个好主意,用户设置主题样式后应立即更改主题。
我尝试通过设置基础 viewcontroller 并在 ViewWillAppear 上设置用户界面样式来做到这一点,但导航栏和标签栏的外观没有改变。
谁能告诉我如何处理这个问题?
谢谢
我们可以通过设置overrideUserInterfaceStyle来立即改变用户界面风格。
我在用户可以 select 主题样式的地方添加了这段代码。
guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
return
}
appDelegate.changeTheme(themeVal)
我希望这对其他人有帮助
此代码是即时的,无需重新启动应用程序!
您只需要使用 notification observer 模式调用用户交互代码或直接调用该函数。
但关键是要在那里访问可见的 window 和 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 以来,密钥 window 不再是 appDelegate 的一部分,您应该
我正在使用 Swift 5.1 和 Xcode 11.1,目前我已经完成 暗模式 设计。
应用程序具有用户可以设置显示主题的设置(浅色、深色、系统默认值) 目前,如果应用程序在用户选择主题后重新启动,它工作正常(我将此 bool 数据保存在 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
}
}
但我看到很多应用在用户设置主题样式后立即更改显示主题。
我认为只更改主题重启应用不是个好主意,用户设置主题样式后应立即更改主题。
我尝试通过设置基础 viewcontroller 并在 ViewWillAppear 上设置用户界面样式来做到这一点,但导航栏和标签栏的外观没有改变。
谁能告诉我如何处理这个问题? 谢谢
我们可以通过设置overrideUserInterfaceStyle来立即改变用户界面风格。 我在用户可以 select 主题样式的地方添加了这段代码。
guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
return
}
appDelegate.changeTheme(themeVal)
我希望这对其他人有帮助
此代码是即时的,无需重新启动应用程序!
您只需要使用 notification observer 模式调用用户交互代码或直接调用该函数。
但关键是要在那里访问可见的 window 和 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 以来,密钥 window 不再是 appDelegate 的一部分,您应该