美文网首页
iconfont在iOS中的使用

iconfont在iOS中的使用

作者: 小呀小苹果呀 | 来源:发表于2020-03-23 19:00 被阅读0次

    iconFont

    iconFont是利用图标生成的字体,是一种矢量图。原理与汉字和emoji一样, 每一个图标对应一个unicode编码。
    使用iconFont可以有助于IPA瘦身、适配。

    如何使用IconFont

    静态注册

    1. 将字体文件拖入项目
    2. 配置.plist文件
    3. 在.plist文件中添加新属性“Fonts provided by application”,该属性的值是一个数组,这意味着可以在这里注册多个字体

    动态注册

    以.ttf与.json(保存了unicode与name的对应关系)结合使用为例:

        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
            }
    
            //资源包下发 
            if tmps.count == 1 {
                return tmps[0]
            }
            else if tmps.count > 1 {
                return tmps.first { $0.fontname != XPSCustomizeFontService.materialIconfontName}
            }
    
            return nil
        }
    

    相关文章

      网友评论

          本文标题:iconfont在iOS中的使用

          本文链接:https://www.haomeiwen.com/subject/dbmjmctx.html