1

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

我的项目结构与此类似:

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

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

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

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

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

更新 1:

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

4

1 回答 1

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")
    }
}

调用UIFont.loadFonts()AppDelegate.swift。

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

于 2019-08-13T19:55:49.497 回答