I'm using Swift 5.1 and Xcode 11.1 and I've currently finished implementing Dark Mode design.
App has setting where user can set display theme(Light, Dark, System Default) and currently it's working fine if app restarts after user selects theme(I save this bool data in UserDefaults and set UIAppearance at app startup in AppDelegate file)
Here's my code
if #available(iOS 13.0, *) {
switch AppState.appThemeStyle {
case "dark":
window?.overrideUserInterfaceStyle = .dark
break
case "light":
window?.overrideUserInterfaceStyle = .light
break
default:
window?.overrideUserInterfaceStyle = .unspecified
}
}
But I can see that many apps change display themes immediately after user sets theme style.
I think It's not good idea to restart app for only changing theme and theme should change immediately after user sets theme style.
I tried to do that by setting base viewcontroller and set user interface style on ViewWillAppear but Navigation bar & Tab bar appearance doesn't change.
Could anyone please tell me how to handle this? Thanks.
To control an interface style for an entire app, you simply set UIUserInterfaceStyle (Appearance) key in your Info. plist file. You can assign it to either Light or Dark value to force a light and dark user interface style. Set Appearance (UIUserInterfaceStyle) key to Light will disable dark mode for an entire app.
If you need extra time to work on your app's Dark Mode support, you can temporarily opt out by including the UIUserInterfaceStyle key (with a value of Light ) in your app's Info. plist file. Setting this key to Light causes the system to ignore the user's preference and always apply a light appearance to your app.
This code is instant and there is no need to restart the app!
You just need to call the code on user interaction with notification observer pattern or directly call the function.
But the point is to access the visible window and overrideUserInterfaceStyle
there. So for example you can set it from any visible view
like:
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()
Also note that since iOS 13, the key window is not a part of appDelegate anymore and you should access it from sceneDelegate
We can change user interface style immediately by setting overrideUserInterfaceStyle. I added this code where user can select theme style.
guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
return
}
appDelegate.changeTheme(themeVal)
I hope this will help others
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With