将 SwiftUI 颜色转换为 UIColor



我想将 SwiftUI 视图颜色转换为 UIKit UIcolor 组件。我已经尝试了几种方法,并且还参考了已经给出答案的StackOverflow,但是它们不起作用。一些用户在这些帖子中也提到了这一点。我已经浏览了图灵测试提出的以下代码

但这行不通。任何建议或帮助都非常感谢。

fileprivate extension Color {
func uiColor() -> UIColor {
let components = self.components()
return UIColor(red: components.r, green: components.g, blue: components.b, alpha: components.a)
}
private func components() -> (r: CGFloat, g: CGFloat, b: CGFloat, a: CGFloat) {
let scanner = Scanner(string: self.description.trimmingCharacters(in: CharacterSet.alphanumerics.inverted))
var hexNumber: UInt64 = 0
var r: CGFloat = 0.0, g: CGFloat = 0.0, b: CGFloat = 0.0, a: CGFloat = 0.0
let result = scanner.scanHexInt64(&hexNumber)
if result {
r = CGFloat((hexNumber & 0xff000000) >> 24) / 255
g = CGFloat((hexNumber & 0x00ff0000) >> 16) / 255
b = CGFloat((hexNumber & 0x0000ff00) >> 8) / 255
a = CGFloat(hexNumber & 0x000000ff) / 255
}
return (r, g, b, a)
}
}

如果您正在寻找最新的答案:

从 iOS 14 开始,UIColor类有一个初始值设定项,它采用 SwiftUI 颜色作为参数:UIColor(Color.red)

基本上,Apple不打算让您进行此转换。SwiftUI的Color是一个View,框架的设计是数据流到一个View,然后显示出来。您永远不应该从View中提取数据。

如果您发现自己需要使用颜色的组件,则应使用UIColor,然后在准备显示它时转换为Color

如果您正在尝试获取系统颜色的组件,例如Color.red,我相信它们与自适应UIColor.systemRed相同,后者确实具有可访问的组件。

标准颜色文档

更新您的答案以摆脱长元组警告,它工作正常。

extension Color {
func uiColor() -> UIColor {
if #available(iOS 14.0, *) {
return UIColor(self)
}
let scanner = Scanner(string: description.trimmingCharacters(in: CharacterSet.alphanumerics.inverted))
var hexNumber: UInt64 = 0
var r: CGFloat = 0.0, g: CGFloat = 0.0, b: CGFloat = 0.0, a: CGFloat = 0.0
let result = scanner.scanHexInt64(&hexNumber)
if result {
r = CGFloat((hexNumber & 0xFF000000) >> 24) / 255
g = CGFloat((hexNumber & 0x00FF0000) >> 16) / 255
b = CGFloat((hexNumber & 0x0000FF00) >> 8) / 255
a = CGFloat(hexNumber & 0x000000FF) / 255
}
return UIColor(red: r, green: g, blue: b, alpha: a)
}
}

最新更新