如何使用 SwiftUI 将应用程序采用到 iOS 13 暗模式?

Posted

技术标签:

【中文标题】如何使用 SwiftUI 将应用程序采用到 iOS 13 暗模式?【英文标题】:How can I adopt apps to iOS 13 Dark mode using SwiftUI? 【发布时间】:2019-08-28 21:45:17 【问题描述】:

当我没有设置foregroundColor 时,SwiftUI 会在Environment 改变时自动将我的对象颜色转换为Dark Mode。但是,当我设置foregroundColor时,例如:

Text("Jason Parker")
    .foregroundColor(Color.black)

SwiftUI 将不再改变对象的颜色。我听说 UIColor 中有系统颜色,但 SwiftUI 的颜色不包含这些变量。如何使用 SwiftUI 将应用程序采用到 ios 13 Dark 模式?

【问题讨论】:

【参考方案1】:

这就是我的做法。首先,如果你想使用UIColor 语义,你可以从……它是beta 5 吗?

Color(color: Color(UIColor.systemBackground)

但如果您想为您的应用自定义颜色,您需要点击colorScheme

@Environment (\.colorScheme) var colorScheme:ColorScheme

有几种使用方法,我可以加一个Color 分机:

extension Color 
    static let yellow = Color.yellow
    static let darkGrey = Color.init(UIColor.darkGray)

    static func backgroundColor(for colorScheme: ColorScheme) -> Color 
        if colorScheme == .dark 
            return yellow
         else 
            return darkGrey
        
    

并像这样使用它:

Text(""Hello world!").background(Color.backgroundColor(for: colorScheme))

现在,显然这是一个简化的配色方案,但你应该明白了。

【讨论】:

【参考方案2】:

你可以强制你的应用只使用暗模式设置

window.overrideUserInterfaceStyle = .dark

在您的 SceneDelegate.swift 中:

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) 
    let contentView = LoginView()

    if let windowScene = scene as? UIWindowScene 
        let window = UIWindow(windowScene: windowScene)
        window.overrideUserInterfaceStyle = .dark
        window.rootViewController = UIHostingController(rootView: contentView)
        self.window = window
        window.makeKeyAndVisible()
    

【讨论】:

以上是关于如何使用 SwiftUI 将应用程序采用到 iOS 13 暗模式?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 中使用 Swift/SwiftUI 将我从应用数据导出的文本文件移动到应用沙箱之外的位置?

如何在我的 IOS SwiftUI 应用程序中打开文件?

iOS 15 中的 Swift 和 SwiftUI

如何重用 socket.io 发射功能?试图将套接字发射功能附加到 SwiftUI 按钮(操作)?

将表单附加到边缘[iOS/SwiftUI]

如何在 XCode 中生成 iOS 13 SwiftUI 项目?