iconFont
iconFont是利用圖標(biāo)生成的字體,是一種矢量圖菜职。原理與漢字和emoji一樣, 每一個(gè)圖標(biāo)對(duì)應(yīng)一個(gè)unicode
編碼。
使用iconFont可以有助于IPA瘦身芋浮、適配妇多。
如何使用IconFont
靜態(tài)注冊(cè)
- 將字體文件拖入項(xiàng)目
- 配置.plist文件
- 在.plist文件中添加新屬性“Fonts provided by application”,該屬性的值是一個(gè)數(shù)組洼专,這意味著可以在這里注冊(cè)多個(gè)字體
動(dòng)態(tài)注冊(cè)
以.ttf與.json(保存了unicode與name的對(duì)應(yīng)關(guān)系)結(jié)合使用為例:
private func registerNewFont(ttfFilePath: String, isCustomize: Bool = true) -> CGFont? {
let ttfUrl = URL(fileURLWithPath: ttfFilePath)
if let fontDataProvider = CGDataProvider(url: ttfUrl as CFURL), let fontRef = CGFont(fontDataProvider) {
let r = CTFontManagerRegisterGraphicsFont(fontRef, nil)
if r == true, isCustomize == true, let fullname = fontRef.fullName {
customizeFontUrls.append(ttfUrl)
customizeFontNames.append(fullname as String)
}
return fontRef
}
return nil
}
private func registerNewIconfont(ttfFilePath: String, JSONFilePath: String, isCustomize: Bool = true) -> Bool {
if let font = registerNewFont(ttfFilePath: ttfFilePath, isCustomize: isCustomize) {
return updateIconinfoModels(font: font, JSONFilePath: JSONFilePath)
}
return false
}
private func unregisterCustomizeFonts() -> Bool {
let r = CTFontManagerUnregisterFontsForURLs(customizeFontUrls as CFArray, CTFontManagerScope.none, nil)
if r {
customizeFontNames.removeAll()
customizeFontUrls.removeAll()
let keys = iconinfoModels.keys
keys.forEach {
iconinfoModels.removeValue(forKey: $0)
}
}
return r
}
private func updateIconinfoModels(font: CGFont, JSONFilePath: String, isCustomize: Bool = true) -> Bool {
if let data = try? Data(contentsOf: URL(fileURLWithPath: JSONFilePath)), let key = font.fullName {
let obj = try? JSONSerialization.jsonObject(with: data, options: .mutableContainers)
if let dic = obj as? [String : Any], let icons = dic["glyphs"] as? [[String : Any]] {
iconinfoModels[key as String] = icons.map { (icon: [String : Any]) -> IconinfoModel in
return IconinfoModel(infoDic: icon)
}
return true
}
}
return false
}
func getIconfontInfo(iconName: String) -> (unicode: String, fontname: String)? {
var tmps = [(unicode: String, fontname: String)]()
_ = iconinfoModels.filter { (key: String, value: [XPSCustomizeFontService.IconinfoModel]) -> Bool in
if let first = value.first(where: { return $0.name == iconName }) {
tmps.append((unicode: first.unicode, fontname: key))
return true
}
return false
}
//資源包下發(fā)
if tmps.count == 1 {
return tmps[0]
}
else if tmps.count > 1 {
return tmps.first { $0.fontname != XPSCustomizeFontService.materialIconfontName}
}
return nil
}