在 Swift 中动态使用 Font Awesome

Using Font Awesome dynamically in Swift

我正在尝试对 Swift 中超赞的字体字符进行动态编码。我正在使用 API,其中 returns 字符代码(格式为 f236),我想将其作为 unicode 注入到 UILabel 中。理想情况下,我想执行以下操作:

var iconCode: String? = jsonItem.valueForKey("icon") as? String
var unicodeIcon = "\u{\(iconCode)}"
label.text = "\(unicodeIcon) \(titleText)"

但是你显然不能这样做。有办法解决这个问题吗?

如果您获得的图标代码为 "fa-xxxx" 那么您可以这样做:

var iconCode = //Code from json...
label.text = "\(String.fontAwesomeIconWithName(iconCode)) \(titleText)"

我假设你在 font awesome 的扩展中有这个方法 fontAwesomeIconWithName() 并且 label.font 被设置为 FontAwesome。

@abdullah 有一个很好的解决方案,但这里有更多关于根本问题的信息,以防有人再次遇到它...

你不能写像 var unicodeIcon = "\u{\(iconCode)}" 这样的东西,因为 Swift 解析字符串转义码的顺序。 \u{xxxx} 已经是一个转义码,你正试图在其中嵌入另一个转义码(字符串插值)——解析器一次只能处理一个。

相反,您需要一种更直接的方法来从十六进制 Unicode 标量值构造 String(实际上是 Character,因为您只有一个)。以下是如何做到这一点(标量值为整数):

let unicodeIcon = Character(UnicodeScalar(0x1f4a9))
label.text = "\(unicodeIcon) \(titleText)"

当然,你的字符代码在一个字符串中,所以你需要从那个字符串中解析出一个整数,然后才能将它传递给上面的。这是 UInt32 的快速扩展:

extension UInt32 {
    init?(hexString: String) {
        let scanner = NSScanner(string: hexString)
        var hexInt = UInt32.min
        let success = scanner.scanHexInt(&hexInt)
        if success {
            self = hexInt
        } else {
            return nil
        }
    }
}

let unicodeIcon = Character(UnicodeScalar(UInt32(hexString: "1f4a9")!))
label.text = "\(unicodeIcon) \(titleText)"

将 iconHex 字符串转换为小数,然后将小数转换为 UnicodeScaler,最后转换为字符。最后使用字符串插值得到结果:

let iconStringHex = "f236"
let iconDecimal = Int(iconStringHex, radix: 16)!

let unicodeIcon = Character(UnicodeScalar(iconDecimal)!)
label.text = "\(unicodeIcon)"
import Foundation
import FontAwesome_swift

class FontAwesomeConverter {
    public static func image(fromChar iconCode: String,
                         color: UIColor) -> UIImage {
    let label = UILabel(frame: .zero)
    label.textColor = color
    label.font = UIFont.fontAwesome(ofSize: 20, style: .solid)

    let iconDecimal = Int(iconCode, radix: 16)!
    let unicodeIcon = Character(UnicodeScalar(iconDecimal)!)
    label.text = "\(unicodeIcon)"
    label.sizeToFit()

    let renderer = UIGraphicsImageRenderer(size: label.frame.size)
    let image = renderer.image(actions: { context in
        label.layer.render(in: context.cgContext)
    })
    return image
   }
 }

extension UILabel {
// MARK:  set center alignment
   public func setFontAwesomeIcon(fromChar iconCode: String,
                        color: UIColor) {
    self.font = UIFont.fontAwesome(ofSize: 30, style: .solid)
    self.textColor = color

    let iconDecimal = Int(iconCode, radix: 16)!
    let unicodeIcon = Character(UnicodeScalar(iconDecimal)!)
    self.text = "\(unicodeIcon)"
    self.sizeToFit()
  }
}

用法:

//对于ImageView图片

imageView_MainMenu.image = FontAwesomeConverter.image(fromChar: "f085", color: .white)

//对于标签

label_MainMenu.setFontAwesomeIcon(fromChar: "f085", color: .white)