diff --git a/Shared/Preferences/PreferencesModel.swift b/Shared/Preferences/PreferencesModel.swift index 1afeba3..39e9c24 100644 --- a/Shared/Preferences/PreferencesModel.swift +++ b/Shared/Preferences/PreferencesModel.swift @@ -1,20 +1,54 @@ import SwiftUI class PreferencesModel: ObservableObject { - @Environment(\.colorScheme) var currentColorScheme - @Published var preferredColorScheme: ColorScheme = .light + /* We're stuck dropping into AppKit/UIKit to set light/dark schemes for now, + * because setting the .preferredColorScheme modifier on views in SwiftUI is + * currently unreliable. + * + * Feedback submitted to Apple: + * + * FB8382883: "On macOS 11β4, preferredColorScheme modifier does not respect .light ColorScheme" + * FB8383053: "On iOS 14β4/macOS 11β4, it is not possible to unset preferredColorScheme after setting + * it to either .light or .dark" + */ + + #if os(iOS) + var window: UIWindow? { + guard let scene = UIApplication.shared.connectedScenes.first, + let windowSceneDelegate = scene.delegate as? UIWindowSceneDelegate, + let window = windowSceneDelegate.window else { + return nil + } + return window + } + #endif + + @Published var selectedColorScheme: ColorScheme? @Published var appearance: Int = 0 { didSet { switch appearance { - case 0: - preferredColorScheme = currentColorScheme case 1: - preferredColorScheme = .light +// selectedColorScheme = .light + #if os(macOS) + NSApp.appearance = NSAppearance(named: .aqua) + #else + window?.overrideUserInterfaceStyle = .light + #endif case 2: - preferredColorScheme = .dark +// selectedColorScheme = .dark + #if os(macOS) + NSApp.appearance = NSAppearance(named: .darkAqua) + #else + window?.overrideUserInterfaceStyle = .dark + #endif default: - print("Unknown option selected, failing gracefully...") +// selectedColorScheme = .none + #if os(macOS) + NSApp.appearance = nil + #else + window?.overrideUserInterfaceStyle = .unspecified + #endif } } } } diff --git a/Shared/WriteFreely_MultiPlatformApp.swift b/Shared/WriteFreely_MultiPlatformApp.swift index 53fee33..891f8f2 100644 --- a/Shared/WriteFreely_MultiPlatformApp.swift +++ b/Shared/WriteFreely_MultiPlatformApp.swift @@ -1,46 +1,46 @@ import SwiftUI @main struct WriteFreely_MultiPlatformApp: App { @StateObject private var preferences = PreferencesModel() @StateObject private var account = AccountModel() #if os(macOS) @State private var selectedTab = 0 #endif #if DEBUG @StateObject private var store = testPostStore #else @StateObject private var store = PostStore() #endif var body: some Scene { WindowGroup { ContentView(postStore: store, preferences: preferences, account: account) - .preferredColorScheme(preferences.preferredColorScheme) +// .preferredColorScheme(preferences.selectedColorScheme) // See PreferencesModel for info. } #if os(macOS) Settings { TabView(selection: $selectedTab) { MacAccountView(account: account) .tabItem { Image(systemName: "person.crop.circle") Text("Account") } .tag(0) MacPreferencesView(preferences: preferences) .tabItem { Image(systemName: "gear") Text("Preferences") } .tag(1) } .frame(minWidth: 300, maxWidth: 300, minHeight: 200, maxHeight: 200) .padding() - .preferredColorScheme(preferences.preferredColorScheme) +// .preferredColorScheme(preferences.selectedColorScheme) // See PreferencesModel for info. } #endif } } diff --git a/WriteFreely-MultiPlatform.xcodeproj/xcuserdata/angelo.xcuserdatad/xcschemes/xcschememanagement.plist b/WriteFreely-MultiPlatform.xcodeproj/xcuserdata/angelo.xcuserdatad/xcschemes/xcschememanagement.plist index 6cd8075..2723ebe 100644 --- a/WriteFreely-MultiPlatform.xcodeproj/xcuserdata/angelo.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/WriteFreely-MultiPlatform.xcodeproj/xcuserdata/angelo.xcuserdatad/xcschemes/xcschememanagement.plist @@ -1,19 +1,19 @@ SchemeUserState WriteFreely-MultiPlatform (iOS).xcscheme_^#shared#^_ orderHint - 1 + 0 WriteFreely-MultiPlatform (macOS).xcscheme_^#shared#^_ orderHint - 0 + 1 diff --git a/iOS/Settings/SettingsView.swift b/iOS/Settings/SettingsView.swift index a9c1d26..5bf73a2 100644 --- a/iOS/Settings/SettingsView.swift +++ b/iOS/Settings/SettingsView.swift @@ -1,29 +1,29 @@ import SwiftUI struct SettingsView: View { @EnvironmentObject var preferences: PreferencesModel @EnvironmentObject var account: AccountModel @Binding var isPresented: Bool var body: some View { VStack { SettingsHeaderView(isPresented: $isPresented) Form { Section(header: Text("Login Details")) { AccountView(account: account) } Section(header: Text("Appearance")) { PreferencesView(preferences: preferences) } } } - .preferredColorScheme(preferences.preferredColorScheme) +// .preferredColorScheme(preferences.selectedColorScheme) // See PreferencesModel for info. } } struct SettingsView_Previews: PreviewProvider { static var previews: some View { SettingsView(isPresented: .constant(true)) } }