如何将 UIColor 转换为 SwiftUI 的颜色
How to convert UIColor to SwiftUI‘s Color
我想使用 UIColor 作为对象的前景色,但我不知道如何将 UIColor 转换为 Color
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)
}
}
到 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))
}
}
用法:
Color(uiColor: .red)
从 beta 5 开始,您可以从 UIColor 创建颜色:
Color(UIColor.systemBlue)
在 Swift UI 中带有方便扩展的自定义颜色:
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 文件中的可重用语句。此示例是内联的,因此更容易查看。我并不是说这是要走的路,它只是 我的 老路。
Screenshot (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
有一个本机初始化程序,它接受 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` */
注意:
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
注意:点击here to see How to convert SwiftUI.Color
to 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)
}
}
我想使用 UIColor 作为对象的前景色,但我不知道如何将 UIColor 转换为 Color
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)
}
}
到 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))
}
}
用法:
Color(uiColor: .red)
从 beta 5 开始,您可以从 UIColor 创建颜色:
Color(UIColor.systemBlue)
在 Swift UI 中带有方便扩展的自定义颜色:
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 文件中的可重用语句。此示例是内联的,因此更容易查看。我并不是说这是要走的路,它只是 我的 老路。
Screenshot (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
有一个本机初始化程序,它接受 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` */
注意:
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
注意:点击here to see How to convert SwiftUI.Color
to 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)
}
}