将SwiftUI颜色转换为UIColor

8
我想将SwiftUI视图颜色转换为UIKit UIcolor组件。 我已经尝试了几种方法,并参考了StackOverflow已经给出的答案,但它们没有起作用。 在那些帖子中,一些用户也提到了这一点。 我已经阅读了以下由turingtested提出的代码,但这不起作用。 非常感谢任何建议或帮助。
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)
    }
}

“this is not working” 的确切含义是什么?它无法编译吗?它会崩溃吗?它会给出错误的结果吗? - Martin R
它适用于像这样声明的“Colors”:Color(red: 0.74, green: 0.5, blue: 0.32),但不适用于静态的颜色,如Color.red - LuLuGaGa
3
那个“解决方案”不应该被使用,它试图从对象的“描述”中提取颜色成分...它可能随时会出问题。 - Alladinian
我认为self.description会打印出"red",表示颜色是红色。 - Chris
3个回答

33

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

iOS 14及以后版本,UIColor类有一个初始化器,可以接受SwiftUI颜色作为参数:UIColor(Color.red)


什么应该是被接受的答案。 - Nic

9
基本上,苹果不打算让您进行此转换。SwiftUI的Color是一个View,并且框架的设计是数据流向View,然后再显示出来。您永远不应该从View中提取数据。
如果您发现自己需要使用颜色的组件,则应使用UIColor,然后在准备显示时转换为Color
如果您正在尝试获取系统颜色(如Color.red)的组件,则我认为它们与自适应的UIColor.systemRed相同,后者具有可访问的组件。 标准颜色文档

1
虽然我理解这个逻辑,但我们不能摆脱UIColor仍然让人感到沮丧。它似乎非常冗余。 - TealShift

4

更新您的答案,以消除长元组警告,这样它就可以正常工作。

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)
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接