如何使用 SwiftUI 中的扩展使 .foregroundColor 接受 UInt32 十六进制

问题描述 投票:0回答:1

我正在尝试使用十六进制更改对象的前景色,但是 .foregroundColor 只接受 Color 类型的值。我在某处听说您可以修改 .foregroundColor 以接受 UInt32 类型的值,但我不确定如何去做。我是 SwiftUI 和一般编程的新手,我在网上找不到其他任何东西可以帮助(或有意义),所以任何东西都会受到赞赏。

我不确定我在做什么或什至从哪里开始(这将解释缺少代码),但我已经尝试过这个并得到错误“扩展中的预期'{'”和“预期的类型名称扩展声明”:

扩展.foregroundColor {

}

swiftui hex extension-methods
1个回答
0
投票

您需要扩展底层的

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 位。

© www.soinside.com 2019 - 2024. All rights reserved.