iOS项目导入自定义字体库

720 阅读1分钟

导入字体

  1. 导入字体库(.ttf)到项目中(如果是SDK开发,则需要导入至bundle资源库中,不是则导入至项目文件夹下即可)
  2. 非SDK开发则在info.plist中加入Fonts provided by application key,在这个value数组下填入导入的字体的文件名称,若是SDK开发则需通过代码方式注册字体(如下)
import Foundation
import UIKit
//需要注册的字体文件名
let fontArray = []

enum RegisterFontError: Error {
  case invalidFontFile
  case fontPathNotFound
  case initFontError
  case registerFailed
}

class FontManager {
    static func staticBundle() -> Bundle? {
        guard let url = Bundle.main.url(forResource: "yourBundleName", withExtension: "bundle") else {
            return nil
        }
        let bundle = Bundle(url: url)
        return bundle
    }
}

extension UIFont {
    static func register(fileNameString: String, type: String) throws {
        let frameworkBundle = FontManager.staticBundle()
        guard let resourceBundleURL = frameworkBundle?.path(forResource:"/FontResource/" + fileNameString, ofType: type) else {
            throw RegisterFontError.fontPathNotFound
        }
        
        guard let fontData = NSData(contentsOfFile: resourceBundleURL),    let dataProvider = CGDataProvider.init(data: fontData) else {
            throw RegisterFontError.invalidFontFile
        }

        guard let fontRef = CGFont.init(dataProvider) else {
            throw RegisterFontError.initFontError
        }

        var errorRef: Unmanaged<CFError>? = nil

        guard CTFontManagerRegisterGraphicsFont(fontRef, &errorRef) else   {
            throw RegisterFontError.registerFailed
        }
    }

    static func registerFonts() {
        fontArray.forEach { name in
            try? UIFont.register(fileNameString: name, type: ".ttf")
        }
    }
}

然后在项目初始化的地方调用 registerFonts 方法注册字体

3.遍历系统字体,找到加入的字体名称(注意:导入的文件名称不一定是实际调用的字体名称,尤其是汉字文件名,实际是用拼音调用)

var i = 0
for family: String in UIFont.familyNames {
    print("\(i)---项目字体---\(family)")
    for names: String in UIFont.fontNames(forFamilyName: family) {
        print("== \(names)")
    }
    i += 1
}

字体调用

UIFont(name: "font_name", size: 14)