How to convert `UIColor` to SwiftUI‘s `Color`

nOk*_*nOk 6 colors uicolor swift swiftui

I want to use a UIColor as foregroundcolor for an object but I don’t know how to convert UIColor to a Color

var myColor: UIColor
RoundedRectangle(cornerRadius: 5).foregroundColor(UIColor(myColor))
Run Code Online (Sandbox Code Playgroud)

Moj*_*ini 27

iOS 和 macOS

Color有一个本地初始化器,它接受一个UIColorNSColor作为参数:

Color(.red) /* or any other UIColor/NSColor you need INSIDE parentheses */
Run Code Online (Sandbox Code Playgroud)

不要Color(UIColor.red)显式调用!!!. 这会将您的 SwiftUI 代码与UIKit. 相反,只需调用Color(.red)That 将自动推断正确的模块。

另外,请注意这个区别:

Color.red     /* this `red` is SwiftUI native `red` */
Color(.red)   /* this `red` is UIKit `red` */
Run Code Online (Sandbox Code Playgroud)

suColor 与 uiColor

注意:

Color.red并且UIColor.red一样的!他们有不同的价值观期待不同的对方。所以不要认为这不值钱

这些是相等的: SwiftUI.Color.Red == UIKit.UIColor.systemRed

此外,您可以查看如何从 SwiftUI.Color 获取 RGB 组件


延期

您可以为它实现一个自定义变量,使其更像cgColorciColor

extension UIColor {
    /// The SwiftUI color associated with the receiver.
    var suColor: Color { Color(self) }
}
Run Code Online (Sandbox Code Playgroud)

所以它会像:

UIColor.red         // UIKit color
UIColor.red.suColor // SwiftUI color
UIColor.red.cgColor // Core graphic color
UIColor.red.ciColor // Core image color
Run Code Online (Sandbox Code Playgroud)

注意:点击这里查看如何转换SwiftUI.ColorUIColor

  • 老实说,这是这里最好的答案。UIColor 上返回“suColor”的扩展非常出色。 (6认同)

kon*_*iki 18

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

Color(UIColor.systemBlue)
Run Code Online (Sandbox Code Playgroud)

  • 值得注意的是,你可以只写:`Color(.systemBlue)` (5认同)
  • 我可以确认这是可行的,如果UIColor是自定义动态颜色,则Color也是动态的。 (2认同)
  • 我必须使用 SwiftUI.Color( myUIColor ) (2认同)

小智 5

使用两个帮助程序扩展:

从中提取成分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)
    }
}
Run Code Online (Sandbox Code Playgroud)

init使用UIColor

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))
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

Color(uiColor: .red)
Run Code Online (Sandbox Code Playgroud)