diff --git a/apps/ios/Shared/AppDelegate.swift b/apps/ios/Shared/AppDelegate.swift index 068693461b..b79d9bbbe3 100644 --- a/apps/ios/Shared/AppDelegate.swift +++ b/apps/ios/Shared/AppDelegate.swift @@ -107,5 +107,6 @@ class SceneDelegate: NSObject, ObservableObject, UIWindowSceneDelegate { guard let windowScene = scene as? UIWindowScene else { return } window = windowScene.keyWindow window?.tintColor = UIColor(cgColor: getUIAccentColorDefault()) + window?.overrideUserInterfaceStyle = getUserInterfaceStyleDefault() } } diff --git a/apps/ios/Shared/Views/UserSettings/AppearanceSettings.swift b/apps/ios/Shared/Views/UserSettings/AppearanceSettings.swift index 98aa97fec7..aaa7d95268 100644 --- a/apps/ios/Shared/Views/UserSettings/AppearanceSettings.swift +++ b/apps/ios/Shared/Views/UserSettings/AppearanceSettings.swift @@ -10,10 +10,15 @@ import SwiftUI let defaultAccentColor = CGColor.init(red: 0, green: 0.533, blue: 1, alpha: 1) +let interfaceStyles: [UIUserInterfaceStyle] = [.unspecified, .light, .dark] + +let interfaceStyleNames: [LocalizedStringKey] = ["System", "Light", "Dark"] + struct AppearanceSettings: View { @EnvironmentObject var sceneDelegate: SceneDelegate @State private var iconLightTapped = false @State private var iconDarkTapped = false + @State private var userInterfaceStyle = getUserInterfaceStyleDefault() @State private var uiTintColor = getUIAccentColorDefault() var body: some View { @@ -28,6 +33,11 @@ struct AppearanceSettings: View { } Section { + Picker("Theme", selection: $userInterfaceStyle) { + ForEach(interfaceStyles, id: \.self) { style in + Text(interfaceStyleNames[interfaceStyles.firstIndex(of: style) ?? 0]) + } + } ColorPicker("Accent color", selection: $uiTintColor, supportsOpacity: false) } header: { Text("Colors") @@ -39,6 +49,10 @@ struct AppearanceSettings: View { Text("Reset colors").font(.callout) } } + .onChange(of: userInterfaceStyle) { _ in + sceneDelegate.window?.overrideUserInterfaceStyle = userInterfaceStyle + setUserInterfaceStyleDefault(userInterfaceStyle) + } .onChange(of: uiTintColor) { _ in sceneDelegate.window?.tintColor = UIColor(cgColor: uiTintColor) setUIAccentColorDefault(uiTintColor) @@ -84,6 +98,25 @@ func setUIAccentColorDefault(_ color: CGColor) { } } +func getUserInterfaceStyleDefault() -> UIUserInterfaceStyle { + switch UserDefaults.standard.integer(forKey: DEFAULT_USER_INTERFACE_STYLE) { + case 1: return .light + case 2: return .dark + default: return .unspecified + } +} + +func setUserInterfaceStyleDefault(_ style: UIUserInterfaceStyle) { + var v: Int + switch style { + case .unspecified: v = 0 + case .light: v = 1 + case .dark: v = 2 + default: v = 0 + } + UserDefaults.standard.set(v, forKey: DEFAULT_USER_INTERFACE_STYLE) +} + struct AppearanceSettings_Previews: PreviewProvider { static var previews: some View { AppearanceSettings() diff --git a/apps/ios/Shared/Views/UserSettings/SettingsView.swift b/apps/ios/Shared/Views/UserSettings/SettingsView.swift index 4177e4496b..053b578d31 100644 --- a/apps/ios/Shared/Views/UserSettings/SettingsView.swift +++ b/apps/ios/Shared/Views/UserSettings/SettingsView.swift @@ -29,6 +29,7 @@ let DEFAULT_DEVELOPER_TOOLS = "developerTools" let DEFAULT_ACCENT_COLOR_RED = "accentColorRed" let DEFAULT_ACCENT_COLOR_GREEN = "accentColorGreen" let DEFAULT_ACCENT_COLOR_BLUE = "accentColorBlue" +let DEFAULT_USER_INTERFACE_STYLE = "userInterfaceStyle" let appDefaults: [String: Any] = [ DEFAULT_SHOW_LA_NOTICE: false, @@ -42,7 +43,8 @@ let appDefaults: [String: Any] = [ DEFAULT_DEVELOPER_TOOLS: false, DEFAULT_ACCENT_COLOR_RED: 0.000, DEFAULT_ACCENT_COLOR_GREEN: 0.533, - DEFAULT_ACCENT_COLOR_BLUE: 1.000 + DEFAULT_ACCENT_COLOR_BLUE: 1.000, + DEFAULT_USER_INTERFACE_STYLE: 0 ] private var indent: CGFloat = 36