如何将UIColor转换为SwiftUI‘;s颜色
我想使用UIColor作为对象的foregroundcolor,但我不知道如何将UIColor转换为颜色如何将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,
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”的默认值,很高兴知道这一点!