从 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 并在你需要时获得 UIColor
或 Color
值。如果你使用像 RSwift 这样的东西,你也可以绕过 ColorResource
。
可以通过简单的初始化程序从 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 并在你需要时获得 UIColor
或 Color
值。如果你使用像 RSwift 这样的东西,你也可以绕过 ColorResource
。