iOS动态切换字体

作者: 四月_Hsu | 来源:发表于2018-11-27 16:53 被阅读74次
    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附带字体资源

    相关文章

      网友评论

        本文标题:iOS动态切换字体

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