从 SwiftUI Color 获取 Dynamic UIColor(明暗模式)

Getting Dynamic UIColor from SwiftUI Color (light and dark mode)

可以通过简单的初始化程序从 SwiftUI 颜色获取 UIColor,如下所示:

let primary = UIColor(Color("primary"))

我在资产目录中添加了具有明暗模式的颜色。 如果在 UIKit 代码中使用 primary,不幸的是,它只给我亮模式版本,并没有动态改变暗模式的颜色。

我不知道,如何从Color中获取深色和浅色模式的颜色来编写自己的扩展作为桥梁。

是否有解决方案,或者您总是从 UIColors 开始并将其桥接到 SwiftUI 代码中?该项目仍然主要基于 UIKit,但新视图是用 SwiftUI 编写的。

我不认为你想要的是可能的。为了实现这一点,您需要一个 Color 的初始化器,它采用浅色和深色变体,以及一种在给定特定界面样式的情况下解析为 cgColor 的方法(这两种方法在 afaik 中都是不可能的)。但是您的共同点可能是资产目录中颜色的颜色名称,并且您可以从标识符中获取 SwiftUI/UIKit 颜色。

struct ColorId: RawRepresentable, Equatable, Hashable {
    let rawValue: String

    init(_ rawValue: String) {
        self.init(rawValue: rawValue)
    }

    init(rawValue: String) {
        self.rawValue = rawValue
    }

    static let primaryText = ColorId("asset_name_of_primary_text_color")
}

extension ColorId {
    var color: Color { Color(rawValue) }
    var uiColor: UIColor? { UIColor(named: rawValue) }
}

struct SomeView: View {
    let textColor = ColorId.primaryText
    var body: some View { 
        Text("Text")
            .foregroundColor(textColor.color)  
    }
}

final class SomeUIView: UILabel {
    private let textColorId: ColorId

    init(textColorId: ColorId) {
        self.textColorId = textColorId
        super.init(frame: .zero)
        self.textColor = textColorId.uiColor
    }
    required init?(coder: NSCoder) { fatalError("need a color id") }
}

然后你传递你的颜色 id 并在你需要时获得 UIColorColor 值。如果你使用像 RSwift 这样的东西,你也可以绕过 ColorResource