在 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)
我正在尝试对 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)