如何让SwiftUI应用跟随或忽略iPadOS深色/浅色配色方案
实现iPadOS应用跟随/忽略系统配色方案的正确方式
你的思路方向是对的,但需要把Picker的选择和应用全局的配色控制关联起来,同时调整状态变量的逻辑。以下是完整的实现方案:
核心思路
通过preferredColorScheme修饰符在应用全局层级控制配色方案,结合@AppStorage持久化用户的选择(跟随/忽略系统)和自定义配色状态,实现需求的功能。
完整代码实现
1. 应用全局配色控制
在你的App结构体中添加全局配色逻辑:
@main struct YourApp: App { // 持久化存储用户选择的显示模式:0=忽略系统,1=跟随系统 @AppStorage("displayMode") private var displayMode = 0 // 持久化存储忽略系统时的自定义深色模式开关 @AppStorage("customDarkMode") private var customDarkMode = false var body: some Scene { WindowGroup { SLDarkmodeSettingsView() .preferredColorScheme(colorSchemeToApply) } } // 根据用户选择计算要应用的配色方案 private var colorSchemeToApply: ColorScheme? { if displayMode == 0 { // 忽略系统,使用自定义设置 return customDarkMode ? .dark : .light } else { // 跟随系统,传递nil让系统自动决定 return nil } } }
2. 修改设置页面交互逻辑
更新设置视图,关联Picker和Toggle的状态,并优化交互体验:
import SwiftUI struct SLDarkmodeSettingsView: View { @Environment(.colorScheme) var systemColorScheme @AppStorage("displayMode") private var displayMode = 0 @AppStorage("customDarkMode") private var customDarkMode = false var body: some View { NavigationStack { List { Section { // 仅当选择「忽略系统配色」时,显示并启用深色模式Toggle if displayMode == 0 { Toggle(isOn: $customDarkMode) { Text("Enable Darkmode") } .alert(isPresented: $customDarkMode) { Alert( title: Text("Warning"), message: Text("Do you really want to enable Darkmode (beta)? Some modules are not adapted to darkmode."), primaryButton: .default(Text("Cancel")) { customDarkMode = false }, secondaryButton: .destructive(Text("Enable").fontWeight(.semibold)) { customDarkMode = true } ) } } Picker(selection: $displayMode, label: Text("Display mode")) { Text("Ignore system scheme").tag(0) Text("Follow system scheme").tag(1) } } header: { Text("Darkmode settings") } footer: { if displayMode == 1 { Text("Currently following system scheme. Custom darkmode settings are disabled.") } else { Text("Toggle the button to enable custom Darkmode. This will override the system's color scheme.") } } } .navigationTitle("Darkmode (BETA)") .navigationBarTitleDisplayMode(.inline) } } } #Preview { SLDarkmodeSettingsView() }
关键逻辑说明
preferredColorScheme是SwiftUI控制应用配色的核心修饰符:传递nil时跟随系统设置,传递.light/.dark时强制使用对应配色。- 用
@AppStorage存储用户选择,确保应用重启后设置依然有效。 - 根据Picker选择动态显示/禁用Toggle,避免无效操作,提升交互合理性。
内容的提问来源于stack exchange,提问作者n3v1010
相关产品推荐
相关产品推荐

