我正在尝试使用十六进制更改对象的前景色,但是 .foregroundColor 只接受 Color 类型的值。我在某处听说您可以修改 .foregroundColor 以接受 UInt32 类型的值,但我不确定如何去做。我是 SwiftUI 和一般编程的新手,我在网上找不到其他任何东西可以帮助(或有意义),所以任何东西都会受到赞赏。
我不确定我在做什么或什至从哪里开始(这将解释缺少代码),但我已经尝试过这个并得到错误“扩展中的预期'{'”和“预期的类型名称扩展声明”:
扩展.foregroundColor {
}
您需要扩展底层的
Color
结构,而不是.foregroundColor
,它是视图修饰符。
但更好的办法是扩展
ShapeStyle
符合的 Color
协议,但仅限于将其用作 Color
. 的特定情况
您可以使用采用
Int
(十进制或十六进制表示法)的自定义初始化来执行此操作,然后屏蔽和位移该值以获得各个颜色分量。然后,您需要将它们转换为 0 和 1 之间的值,因为这是 Color
初始化器采用的值(不像它的 UIKit 对应值 0...255)
extension ShapeStyle where Self == Color {
init(fromInt value: Int) {
let red = CGFloat((value & 0xFF0000) >> 16) / 255
let green = CGFloat((value & 0x00FF00) >> 8) / 255
let blue = CGFloat(value & 0x0000FF) / 255
self.init(red: red, green: green, blue: blue)
}
}
然后您可以在需要
Color
的任何地方使用this,例如在您的问题中.foregroundColor
:
struct ContentView: View {
var body: some View {
Text("I'm red text")
.foregroundColor(Color(fromInt: 0xff0000))
}
}
注意:十六进制颜色字符串实际上应该是一个由四部分组成的字符串;如上所述的三种颜色,以及作为最后 2 个十六进制数字的 alpha 通道。在这种情况下,您需要通过额外的字符扩展掩码并将每个值再移位 8 位。