在iOS开发中,色彩是界面设计中不可或缺的部分,而`UIColor`是苹果提供用来处理颜色的主要类。有时候,我们可能需要将16进制的颜色代码转换为`UIColor`对象,或者相反,将`UIColor`对象转换为16进制字符串。这种转换在处理自定义颜色或者从网页设计中获取颜色值时特别有用。以下将详细讲解这个过程。

1. **16进制颜色格式**:

16进制颜色是一种表示颜色的方式,通常以`#RRGGBB`或`#RGB`的格式表示,其中`RR`、`GG`、`BB`分别代表红色、绿色和蓝色通道的2位16进制数值。例如,`#FF0000`表示纯红色,`#00FF00`表示纯绿色,`#0000FF`表示纯蓝色。

2. **16进制到UIColor转换**:

要将16进制颜色转换为`UIColor`,首先需要将16进制字符串解析成RGB值,然后使用`UIColor`的`+ (UIColor *)colorWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha`方法创建颜色对象。需要注意的是,RGB值需要转换为0.0到1.0之间的浮点数。

```swift

func hexStringToUIColor(hex: String) -> UIColor? {

let r, g, b: CGFloat

if hex.hasPrefix("#") {

let hexColor = hex.dropFirst()

if hexColor.count == 3 {

let rStr = hexColor[0...0]

let gStr = hexColor[1...1]

let bStr = hexColor[2...2]

r = CGFloat(Int(rStr, radix: 16)) / 255.0

g = CGFloat(Int(gStr, radix: 16)) / 255.0

b = CGFloat(Int(bStr, radix: 16)) / 255.0

return UIColor(red: r, green: g, blue: b, alpha: 1.0)

}

}

return nil

}

```

将UIColor对象转换为16进制字符串的代码如下:

```swift

func uIColorToHexString(color: UIColor) -> String? {

var red: CGFloat = 0.0, green: CGFloat = 0.0, blue: CGFloat = 0.0, alpha: CGFloat = 0.0

guard color.getRed(&red, green: &green, blue: &blue, alpha: &alpha) else { return nil }

let hexRed = String(format: "%.2f", red * 255.0)

let hexGreen = String(format: "%.2f", green * 255.0)

let hexBlue = String(format: "%.2f", blue * 255.0)

return "#\(hexRed)((\(hexGreen)))(\(hexBlue))"

}

```

这段代码首先获取颜色的红、绿、蓝和透明度值,然后将它们乘以255并保留两位小数。最后,将这些值拼接成一个16进制字符串并返回。

以下是重构后的内容:

```swift

private func rgbaStringFromHex(_ hex: Int) -> String? {

let r = String(format: "%02X", Int(roundf(red * 255)))

let g = String(format: "%02X", Int(roundf(green * 255)))

let b = String(format: "%02X", Int(roundf(blue * 255)))

return "#" + r + g + b

}

func colorFromHexString(_ hex: Int) -> UIColor? {

let hexString = String(hex, radix: 16)

if let redHex = hexString.substring(with: Range(0..<2)),

let greenHex = hexString.substring(with: Range(2..<4)),

let blueHex = hexString.substring(with: Range(4..<6)) {

let r = Int(redHex, radix: 16) ?? 0

let g = Int(greenHex, radix: 16) ?? 0

let b = Int(blueHex, radix: 16) ?? 0

return UIColor(red: r/255.0, green: g/255.0, blue: b/255.0, alpha: 1.0)

} else {

return nil

}

}

```