ios 如何遵循或忽略iPadOS的配色方案(暗/亮)

66bbxpm5  于 12个月前  发布在  iOS
关注(0)|答案(1)|浏览(142)

我有一个问题,我怎么能忽略或遵循iPadOs的配色方案?我在网上找遍了,找不到一个可以帮助我的答案。

我的期望:

我创建了一个选择器来选择“忽略系统方案”或“遵循系统方案”。如果用户选项卡上的“忽略系统方案”的应用程序应该有自己的配色方案,不应该遵循设备的配色方案(例如:**设备配色:**深色·**应用配色:**浅色)。

我所尝试的

我已经创建了一个AppStorage属性来检查和更改应用程序的颜色方案之间的黑暗和光明。我是否也应该调用“忽略系统方案”功能?
下面是我的代码:

import SwiftUI

struct SLDarkmodeSettingsView: View {
    @Environment(\.colorScheme) var colorScheme
    @AppStorage("isDarkMode") private var isDarkMode = false
    @State private var darkmodePicker = 0
    
    var body: some View {
        NavigationStack {
            List  {
                Section() {
                    HStack {
                        Toggle(isOn: $isDarkMode) {
                            Text("Enable Darkmode")
                        }
                        .alert(isPresented: $isDarkMode) {
                            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"), action: {
                                    isDarkMode = false
                            }), secondaryButton: .destructive(Text("Enable").fontWeight(.semibold), action: {
                                    // TODO: Call the darkmode func
                                    isDarkMode = true
                                }))
                            }
                    }
                    HStack {
                        // TODO: Link toggle and picker, add darkmode support in v.1.2
                        Picker(selection: $darkmodePicker, label: Text("Display mode")) {
                            Text("Ignore system scheme").tag(0)
                            Text("Follow system scheme").tag(1)
                        }
                    }
                } header: {
                    Text("Darkmode settings")
                } footer: {
                    Text("Toggle the button to enable Darkmode. Note if your system is on a light scheme and you've selected Follow system scheme the darkmode setting will be ignored. Please select 'Ignore system scheme'.")
                }
            }
            .navigationTitle("Darkmode (BETA)")
            .navigationBarTitleDisplayMode(.inline)
        }
    }
}

#Preview {
    SLDarkmodeSettingsView()
}

你能帮我看看我的方法是否正确吗?我说的对吗您的帮助将不胜感激!🙂

zdwk9cvp

zdwk9cvp1#

这可以通过将Info.plist中的以下键值对设置为“禁用”系统配色方案来实现。

<key>UIUserInterfaceStyle</key>
<string>Light</string>

一旦你设置了它,这样应用程序就会忽略设备设置的主题,下一步就是设置一种处理交换该主题的方法。你可以在你的基本视图上使用.environment(\.colorScheme, .light)视图修改器来设置这个值。例如

var customColorScheme: ColorScheme {
    return .dark
}

@main
struct YourAppName: App {
    var body: some Scene {
        YourMainLaunchView()
            .environment(\.colorScheme, customColorScheme)
    }
}

这应该具有关于环境对象的YourMainLaunchView()的所有子视图的效果。但是你应该知道这是一个单向绑定。因此,简单地更改它,而不以某种方式刷新视图,将导致在重新计算视图之前没有任何更改。您可能希望观察该值的变化,并处理它发生变化但没有像您期望的那样立即更新的情况。一个简单的解决方案是将customColorScheme替换为@State对象或@EnvironmentObject,然后在.environment(...)修改器中替换。当你努力实现它时,它会变得显而易见。

相关问题