如何将UIColor转换为SwiftUI‘;s颜色

如何将UIColor转换为SwiftUI‘;s颜色,swift,colors,uicolor,swiftui,Swift,Colors,Uicolor,Swiftui,我想使用UIColor作为对象的foregroundcolor,但我不知道如何将UIColor转换为颜色 var myColor: UIColor RoundedRectangle(cornerRadius: 5).foregroundColor(UIColor(myColor)) 使用两个辅助程序扩展: 要从UIColor提取组件: extension UIColor { var rgba: (red: CGFloat, green: CGFloat, blue: CGFloat,

我想使用UIColor作为对象的foregroundcolor,但我不知道如何将UIColor转换为颜色

var myColor: UIColor
RoundedRectangle(cornerRadius: 5).foregroundColor(UIColor(myColor))

使用两个辅助程序扩展:

要从
UIColor
提取组件:

extension UIColor {
    var rgba: (red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) {
        var red: CGFloat = 0
        var green: CGFloat = 0
        var blue: CGFloat = 0
        var alpha: CGFloat = 0
        getRed(&red, green: &green, blue: &blue, alpha: &alpha)

        return (red, green, blue, alpha)
    }
}
extension Color {
    init(uiColor: UIColor) {
        self.init(red: Double(uiColor.rgba.red),
                  green: Double(uiColor.rgba.green),
                  blue: Double(uiColor.rgba.blue),
                  opacity: Double(uiColor.rgba.alpha))
    }
}
使用
UIColor
初始化
init

extension UIColor {
    var rgba: (red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) {
        var red: CGFloat = 0
        var green: CGFloat = 0
        var blue: CGFloat = 0
        var alpha: CGFloat = 0
        getRed(&red, green: &green, blue: &blue, alpha: &alpha)

        return (red, green, blue, alpha)
    }
}
extension Color {
    init(uiColor: UIColor) {
        self.init(red: Double(uiColor.rgba.red),
                  green: Double(uiColor.rgba.green),
                  blue: Double(uiColor.rgba.blue),
                  opacity: Double(uiColor.rgba.alpha))
    }
}
用法:

Color(uiColor: .red)

从beta 5开始,您可以从UIColor创建颜色:

Color(UIColor.systemBlue)

采用Swift用户界面定制颜色,扩展方便:

extension UIColor {
struct purple {
    static let normal = UIColor(red:0.043, green:0.576 ,blue:0.588 , alpha:1.00)
    static let light = UIColor(red: 1, green: 1, blue: 1, alpha: 1)
    static let dark = UIColor(red: 1, green: 1, blue: 1, alpha: 1)
}
struct gray {
    static let normal = UIColor(red:0.5, green:0.5 ,blue:0.5 , alpha:1.00)
    static let dark = UIColor(red: 1, green: 1, blue: 1, alpha: 1)
}
}
使用这个:

var body: some View {
    Text("Hello World")
    .foregroundColor(Color(UIColor.purple.normal))
    .background(Color(UIColor.gray.normal))
}

使用Xcode 11.0 beta 6编辑,代码可能会更改

我是一个真正的老爱好者。这里有一种方法对我有效。是的,我确实在Constant.swift文件中对可重用语句使用globals。此示例是内联的,因此更易于查看。我不是说这是一条路,这只是我的老办法

iOS和macOS都有
Color
有一个本机初始值设定项,它将
UIColor
NSColor
作为参数:

Color(.red) /* or any other UIColor/NSColor you need INSIDE parentheses */
不要调用
Color(UIColor.red)
显式。这将把您的SwiftUI代码耦合到
UIKit
。相反,只需调用
Color(.red)
即可自动推断出正确的模块

另外,请注意这个区别:

Color.red     /* this `red` is SwiftUI native `red` */
Color(.red)   /* this `red` is UIKit `red` */
struct ContentView: View {
       var body: some View {
        Rectangle()
            .frame(width: 100, height: 100)
            .foregroundColor(.someColor)
    }
}

请注意:
Color.red
UIColor.red
不一样!它们有不同的值,并且彼此看起来不同。所以不要认为这毫无价值

它们是相等的:
SwiftUI.Color.Red==UIKit.UIColor.systemRed

此外,您还可以查看


延伸 您可以为它实现一个自定义变量,使其更像
cgColor
ciColor

extension UIColor {
    /// The SwiftUI color associated with the receiver.
    var suColor: Color { Color(self) }
}
因此,这就像:

UIColor.red         // UIKit color
UIColor.red.suColor // SwiftUI color
UIColor.red.cgColor // Core graphic color
UIColor.red.ciColor // Core image color


注意:单击

创建如下扩展:

extension Color {
    static let someColor = Color(UIColor.systemIndigo) // << Select any UIColor
}

我知道我可以使用单一属性,但我认为可能有一个更简单的方法,我得到了,但苹果可能已经为我提供了一个方法,所以我认为这是合法的要求。很抱歉,如果你不认为soI发现没有内置的强制,这就是为什么我接受答案来帮助其他人解决同一个问题。检查
getRed(uquo:green:blue:alpha:)
的返回值很重要。它可能会失败。我可以确认这是可行的,如果
UIColor
是一种自定义动态颜色,那么
颜色也会是动态的。值得注意的是,你可以写:
color(.systemBlue)
你会怎么做呢,从颜色到UIColor?这确实是最好的答案。UIColor上返回
suColor
的扩展非常出色。SwiftUI的“Color.red”等于UIKit的“Color(.systemRed)”或“UIColor.systemRed”!这意味着SwiftUI隐式使用systemRed作为其“Color.red”的默认值,很高兴知道这一点!