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

CRo*_*oig 1 cocoa-touch custom-font ios xcode-workspace

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

我的项目结构类似于:

MainProject
    |_ Appearance.xcodeproj
    |       |_ ... 
    |       |_ Controller.swift
    |       |_ Resources
    |             |_ Font1.ttf
    |             |_ Font2.ttf
    |       |_ Products
    |             |_ Appearance.framework
    |_ ...
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

更新1:

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

小智 7

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

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")
    }
}
Run Code Online (Sandbox Code Playgroud)

调用UIFont.loadFonts()AppDelegate.swift。

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