如何将 UIColor 转换为 SwiftUI 的 Color

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

var myColor: UIColor
RoundedRectangle(cornerRadius: 5).foregroundColor(UIColor(myColor))
39799 次浏览

使用两个助手扩展:

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

initUIColor:

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:

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

SwiftUIColor包装:

extension UIColor {
var toSUIColor: Color {
Color(self)
}
}

用这个:

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


// with wrap
//.foregroundColor(UIColor.purple.normal.toSUIColor)
//.background(UIColor.gray.normal.toSUIColor)
}

我是个很老的业余爱好者。这是一个对我有效的方法。是的,我确实在 Constant.swift 文件中使用全局变量来处理可重用语句。这个示例是内联的,因此更容易看到。我不说这是方式去,这只是 天啊老的方式。

截图(27k)

   import SwiftUI


// named color from the developer's pallet
let aluminumColor = Color(UIColor.lightGray)


// a custom color I use often
let butterColor = Color.init(red: 0.9993399978,
green: 0.9350042167,
blue: 0.5304131241)


// how I use this in a SwiftUI VStack:


Text("Fur People")
.font(.title)
.foregroundColor(aluminumColor)
.shadow(color: butterColor, radius: 4, x: 2, y: 2)
.minimumScaleFactor(0.75)

IOS 和 macOS

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

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` */

suColor vs uiColor

请注意:

Color.redUIColor.red没有相同的! 它们彼此之间有 不同的价值观看起来不一样了。所以不要假设 这一切都毫无意义

取而代之的是相等的: SwiftUI.Color.Red == UIKit.UIColor.systemRed

另外,你可以查看 < strong > < a href = “ https://stackoverflow./a/62994482/5623035”> How to get RGB Component from SwiftUI.Color


分机

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

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

注意 : 点击 < a href = “ https://stackoverflow. com/a/62994667/5623035”在这里查看如何 < strong > 将 SwiftUI.Color转换为 UIColor

创建这样的扩展:

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

用法:

struct ContentView: View {
var body: some View {
Rectangle()
.frame(width: 100, height: 100)
.foregroundColor(.someColor)
}
}