如何使用 Xcode 工作区中生成的框架中的自定义字体

Posted

技术标签:

【中文标题】如何使用 Xcode 工作区中生成的框架中的自定义字体【英文标题】:How to use custom fonts from a framework generated within Xcode workspace 【发布时间】:2018-10-15 07:14:56 【问题描述】:

我正在尝试按功能封装和组织我的 Xcode 项目。为此,我正在创建一个嵌入在主项目中的框架项目。该框架包含所有应用外观(带有颜色定义和自定义字体)。

我的项目结构是这样的:

MainProject
    |_ Appearance.xcodeproj
    |       |_ ... 
    |       |_ Controller.swift
    |       |_ Resources
    |             |_ Font1.ttf
    |             |_ Font2.ttf
    |       |_ Products
    |             |_ Appearance.framework
    |_ ...

这个想法是只编译一次 Appearance.framework 并使用主项目中嵌入的自定义字体。尽管标头已暴露并且没有编译错误,但我遇到了运行时错误。

框架中的控制器使用UIFont(name: "Font1", size: 9)! 但是,返回的是nil

我阅读了有关在主项目 Info.plist 上添加字体完整路径的信息。尽管如此,该框架是本地的,不由 cocoapods 管理。所以输出是派生数据。

这是嵌入这种框架的正确方法吗?任何人都可以为此目的提供解决方案吗?改变我的方法没有任何问题。

更新 1:

另外,我注意到框架是在 XCode Derived Data 文件夹中生成的。有没有机会,可以在本地文件夹上生成框架,这样就可以在git上跟踪了?

【问题讨论】:

您是否在 Info.plist 文件中注册了您的字体? 是的。我在框架的 plist 中注册了字体。我也在 MainProject one 上做过。 您是否尝试过构建阶段制作脚本以将它们复制到主目标文件夹?您是否还在 Main 目标和框架上注册了字体? - 不确定最后一个是否有效 【参考方案1】:

这是您在内存中注册字体的方式:

extension UIFont 
    private static func registerFont(withName name: String, fileExtension: String) 
        let frameworkBundle = Bundle(for: AnyClassFromFramework.self)
        let pathForResourceString = frameworkBundle.path(forResource: name, ofType: fileExtension)
        let fontData = NSData(contentsOfFile: pathForResourceString!)
        let dataProvider = CGDataProvider(data: fontData!)
        let fontRef = CGFont(dataProvider!)
        var errorRef: Unmanaged<CFError>? = nil

        if (CTFontManagerRegisterGraphicsFont(fontRef!, &errorRef) == false) 
            print("Error registering font")
        
    

    public static func loadFonts() 
        registerFont(withName: "Font1", fileExtension: "ttf")
        registerFont(withName: "Font2", fileExtension: "ttf")
    

在 AppDelegate.swift 中调用 UIFont.loadFonts()

之后您应该能够创建您的UIFont(name: "Font1", size: 17)

【讨论】:

以上是关于如何使用 Xcode 工作区中生成的框架中的自定义字体的主要内容,如果未能解决你的问题,请参考以下文章

优化实体框架中生成的sql查询?

Xcode 6 大小类中的自定义字体大小无法与自定义字体一起正常工作

在数据库中添加新行时,报表工作室中生成的自动更新报表

受益于 Play 中生成的 getter 和 setter!框架

如何从 xcode 中的自定义权利设置中删除 Entitlements.plist

如何使用/引用在同一个 json 模式中生成的字段值