本文将介绍如何在 Xcode 12、Swift 5.3 和 iOS 13 环境下,使用扩展(Extension)来解决 UI 给出的颜色往往都是十六进制的,如 #1a1a1a 等,但是我们在 iOS 中是不能直接使用的的问题。我们将提供一个改进版本的解决方案。

首先,我们需要创建一个新的 Swift 文件,例如 string.swift。然后,在这个文件中复制以下代码:

```swift

import Foundation

extension String {

init(hex: Int) {

let hexString = String(format: "#%06x", abs(hex))

self.init(hexString)

}

}

```

这段代码定义了一个名为 `String` 的扩展,它接受一个整数参数 `hex`,并将其转换为一个六位十六进制字符串。然后,我们使用这个字符串初始化一个新的 `String` 对象。这样,我们就可以直接使用这个扩展来创建颜色对象了。

例如,要创建一个与给定十六进制颜色相同的颜色对象,我们可以这样做:

```swift

let color = UIColor(hex: 0x1a1a1a)

```

或者使用我们刚刚定义的扩展:

```swift

let color = UIColor(hex: 0x1a1a1a) as! UIColor

```

```swift

// String.swift

// bestWhiteNoise

// Created by 袁超 on 2020/10/10.

import Foundation

import UIKit

extension String {

/// 十六进制字符串颜色转为UIColor

/// - Parameter alpha: 透明度

func uicolor(alpha: CGFloat = 1.0) -> UIColor {

// 存储转换后的数值

var red: UInt64 = 0, green: UInt64 = 0, blue: UInt64 = 0

var hex = self

// 如果传入的十六进制颜色有前缀,去掉前缀

if hex.hasPrefix("0x") || hex.hasPrefix("0X") {

hex = String(hex[hex.index(hex.startIndex, offsetBy: 2)...])

} else if hex.hasPrefix("#") {

hex = String(hex[hex.index(hex.startIndex, offsetBy: 1)...])

}

// 如果传入的字符数量不足6位按照后边都为0处理,当然你也可以进行其它操作

if hex.count < 6 {

for _ in 0..<6-hex.count {

hex += "0"

}

}

// 分别进行转换

// 红

Scanner(string: String(hex[..

// 绿

Scanner(string: String(hex[hex.index(hex.startIndex, offsetBy: 2)..

// 蓝

Scanner(string: String(hex[hex.index(hex.startIndex, offsetBy: 4)...])).scanHexInt64(&blue)

return UIColor(red: CGFloat(red)/255.0, green: CGFloat(green)/255.0, blue: CGFloat(blue)/255.0, alpha: alpha)

}

}

```

本文主要介绍如何在 iOS 项目中使用扩展函数实现颜色转换,以及如何设置 TabBarItem 的字体颜色。

首先,我们需要一个可以将十六进制颜色字符串转换为 UIColor 的扩展函数。我们在网上找到了这个函数:uicolor(hexString:)。这个函数可以方便地将十六进制颜色字符串转换为 UIColor 对象。例如,如果 UI 给我们的颜色是 #5188e1,那么我们可以直接使用这个函数将其转换为 UIColor 对象。具体代码如下:

```swift

extension UIColor {

static func uicolor(_ hexString: String) -> UIColor {

let scanner = Scanner(string: hexString)

scanner.currentIndex = hexString.startIndex

var color: UInt64 = 0

scanner.scanHexInt64(&color)

let mask = 0x000000FF

let r = Int(Color(red: CGFloat((color & mask) >> 0) / 255.0))

let g = Int(Color(green: CGFloat((color & mask) >> 8) / 255.0))

let b = Int(Color(blue: CGFloat((color & mask) >> 16) / 255.0))

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

}

}

```

接下来,我们可以使用这个扩展函数来设置 TabBarItem 的字体颜色。假设我们有一个名为 item 的 TabBarItem,我们可以使用以下代码设置其选中状态的字体颜色:

```swift

let selectedColor = "#5188e1".uicolor()

item.setTitleTextAttributes([NSAttributedString.Key.foregroundColor: selectedColor], for: .selected)

```

这样,当 item 被选中时,其字体颜色会变为 #5188e1 对应的颜色。需要注意的是,这个方法适配了 iOS 13 及更高版本,因为在 iOS 13 中,原来的 scanHexInt34 方法被废弃了。