本文将介绍如何在 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 方法被废弃了。