我目前正在研究我的应用程序中的黑暗模式。虽然黑暗模式本身并不是什么难事,因为我的SwiftUI基础,我正在与设置独立于系统ColorScheme的ColorScheme选项斗争。
I found this in apples human interface guidelines,我想实现此功能。(链接:(x、x、e、f、x)
你知道如何在SwiftUI中实现这一点吗?我找到了一些关于@Environment
的提示,但没有关于这个主题的进一步信息。(链接:(Last paragraph)
我目前正在研究我的应用程序中的黑暗模式。虽然黑暗模式本身并不是什么难事,因为我的SwiftUI基础,我正在与设置独立于系统ColorScheme的ColorScheme选项斗争。
I found this in apples human interface guidelines,我想实现此功能。(链接:(x、x、e、f、x)
你知道如何在SwiftUI中实现这一点吗?我找到了一些关于@Environment
的提示,但没有关于这个主题的进一步信息。(链接:(Last paragraph)
8条答案
按热度按时间mhd8tkvw1#
单一视图
要更改单个视图的配色方案(可能是应用的主
ContentView
),您可以使用以下修饰符:或
此外,你可以将它应用到
ContentView
上,让你的整个应用变暗!假设您没有更改场景代理中的
ContentView
名称或@main
整个应用程序(包括
UIKit
部件和SwiftUI
)首先,您需要访问窗口以更改在
UIKit
中调用UserInterfaceStyle
的应用colorScheme。我在
SceneDelegate
中使用了以下代码:然后你需要把一个动作绑定到这个开关上,所以你需要一个模型。
最后,您只需要切换开关:
从应用程序的UIKit部分
每个
UIView
都可以访问该窗口,因此您可以使用它将. overrideUserInterfaceStyle
的值设置为您需要的任何方案。yh2wf1be2#
使用
@AppStorage
切换暗模式的演示PS:对于全局开关,修饰符应添加到WindowGroup/MainContentView
jckbn6z73#
@Mojtaba Hosseini的回答确实帮助了我,但我使用的是iOS14的
@main
而不是SceneDelegate
,沿着一些UIKit
视图,所以我最终使用了这样的东西(这不会切换模式,但它确实在SwiftUI
和UIKit
之间设置了暗模式:fae0ux8s4#
@ADB的答案很好,但我找到了一个更好的答案。希望有人能找到比我更好的答案:D这种方法不会在应用切换状态(进入后台然后返回)时一遍又一遍地调用同一个函数。
在
@main
视图中添加:现在创建
DarkModeViewModifier()
视图模型:xpcnnkqh5#
在系统范围内使用SwiftUI和SceneDelegate生命周期
我使用了in the answer by Mojtaba Hosseini在回答中提供的提示,在SwiftUI(具有AppDelegate生命周期的应用程序)中创建了我自己的版本。
这里有一个GitHub repo的链接。这个例子有light,dark和automatic picker来改变整个应用程序的设置。
而且我还多花了一点时间让它可以本地化!
GitHub repo
我需要访问
SceneDelegate
,我使用与Mustapha相同的代码,但有一个小的补充,当应用程序启动时,我需要读取存储在UserDefaults或@AppStorage等中的设置。因此,我在启动时再次更新UI:
函数
updateUserInterfaceStyle()
将在SceneDelegate
中。我在这里使用UserDefaults的扩展,使其与iOS 13兼容(多亏了twanni!):这与apple documentation for
UIUserInterfaceStyle
一致使用选取器意味着我需要迭代我的三个case,所以我创建了一个枚举,它符合identified,并且本地化的类型为
LocalizedStringKey
:下面是picker的完整代码:
代码
onAppear
用于在用户进入设置视图时将滚轮设置为正确的值。每次通过.onChange
修改器移动滚轮时,用户默认值都会更新,应用程序通过引用SceneDelegate
更改所有视图的设置。(如果有兴趣,GH回购协议上有一个gif。)
a5g8bdjr6#
nzk0hqpo7#
我已经使用了@Arturo的答案,并结合了@ multudes的一些工作,来实现我自己的实现
我仍然在设置视图中添加@main
然后我有以下内容:
工作几乎完美-我唯一的问题是当从用户选择的值切换到系统设置时,它不会更新设置视图本身。当从系统切换到暗/亮或在暗和亮之间切换时,它的设置屏幕确实更新得很好。
guicsvcw8#
让我们试着让生活变得更简单,
在初始应用程序启动代码中,添加以下内容,
现在你可以单独设置AppearanceView并可以进行以下操作,
和外观枚举,