iOS-阅读器系列开发中涉及到的方方面面

iOS动态切换字体

2018-11-27  本文已影响74人  四月_Hsu
1、做阅读APP,现在需要添加不同的阅读字体

如果字体过多,并不适宜打包到APP项目中,会增加包体积。将字体下载到本地,然后加载字体数据,即可。

2、 三方字体下载使用。

很多用到的三方字体并未在系统字体库中,关于系统字体的详细分析,可参考一文让你彻底了解iOS字体相关知识。现在使用已经下载好的站酷小微字体测试,介绍如何使用。

3、 代码实例

完整字体使用代码。项目运行过程中注册一次即可。


/// 字体更换

import UIKit

class HsuFontHandler: NSObject {
    var fontNameString: String?
    
    static let shared = HsuFontHandler()
    private override init() {
        super.init()
    }
    
    /// 设置字体
    func setupFont() {
        let path = Bundle.main.path(forResource: "XiaoweiLogo", ofType: "otf")
        if path == nil {
            print("未找到本地字体资源")
            return
        }
        fontNameString = customFontWith(path: path!, size: 18)
    }
    
    /// 根据路径资源获取字体
    ///
    /// - Parameters:
    ///   - path: 资源地址
    ///   - size: 字体大小
    /// - Returns: 字体名
    private func customFontWith(path: String, size: CGFloat) -> String? {
        let fontUlr = URL(fileURLWithPath: path)
        let fontData = CGDataProvider(url: fontUlr as CFURL)
        guard let fontDataProvider = fontData else {
            print("字体资源加载失败")
            return nil
        }
        
        let fontRef = CGFont(fontDataProvider)
        let error: UnsafeMutablePointer<Unmanaged<CFError>?>? = nil
        
        guard let fontReff = fontRef else {
            print("字体转换失败")
            return nil
        }
        
        // 注册字体
        let regiester = CTFontManagerRegisterGraphicsFont(fontReff, error)
        if !regiester {
            print("字体注册失败")
            return nil
        }
        
        // 字体名
        guard let fontName = fontReff.fullName else {
            print("获取字体失败")
            return nil
        }
        
        return fontName as String
    }

使用:


class ViewController: UIViewController {
    @IBOutlet weak var fontLabel: UILabel!
    private let Text = "今天是个好天气"
    override func viewDidLoad() {
        super.viewDidLoad()
        fontLabel.text = Text
        // 设置字体
        HsuFontHandler.shared.setupFont()
    }

    // 特殊字体
    @IBAction func changeFont(_ sender: Any) {
        fontLabel.font = UIFont(name: HsuFontHandler.shared.fontNameString ?? "", size: 20) ?? UIFont.systemFont(ofSize: 20)
    }
    
    // 正常字体
    @IBAction func normalFont(_ sender: Any) {
        fontLabel.font = UIFont.systemFont(ofSize: 20)
    }
    
}

效果:


正常字体 特殊字体
4、 Demo附带字体资源
上一篇下一篇

猜你喜欢

热点阅读