从 Swift 包加载字体

Load fonts from a Swift Package

我想知道目前是否有办法从 Swift 包中加载字体? 字体文件在包中,但编译后的程序找不到它们。

✅ 现已支持

从Swift5.3开始,你可以在目标中添加任何resources,包括图片、资产、字体、zip等。使用目录名将包括该目录的所有子文件:

    .target(
        name: "ABUIKit",
        dependencies: [],
        resources: [.process("Resources") // <- this will add Resource directory to the target
        ]
    ),

请注意您应该将 Resources 文件夹放在 sources/packageName 下以使其易于识别。

⚠️还有,别忘了注册哦!

您需要注册字体才能使用。所以你可以使用像 FontBlaster.

这样的框架

所以你在 模块的 代码的早期某处调用它(就像一些初始化方法):

FontBlaster.blast(bundle: .module)

那么你就可以在模块内部甚至模块外部使用字体了!


无需手动命名字体!

它将自动注册所有包含的字体。您可以在调用 blast 方法后立即仔细检查加载的字体:

FontBlaster.loadedFonts.forEach { print("", [=12=]) }

Mojtaba Hosseini 的回答是正确的,但为了使用您的包的字体,您还需要注册它们。 您可以在结构中使用一些支持功能来完成它...我在我的项目中使用它:

public struct Appearance {

    /// Configures all the UI of the package
    public static  func configurePackageUI() {
        loadPackageFonts()
    }

    static func loadPackageFonts() {
    
        // All the filenames of your custom fonts here
        let fontNames = ["Latinotype - Texta-Black.otf",
                         "Latinotype - Texta-BlackIt.otf",
                         "Latinotype - Texta-Bold.otf",
                         "Latinotype - Texta-BoldIt.otf",
                         "Latinotype - Texta-Book.otf",
                         "Latinotype - Texta-BookIt.otf",
                         "Latinotype - Texta-Heavy.otf",
                         "Latinotype - Texta-HeavyIt.otf",
                         "Latinotype - Texta-It.otf",
                         "Latinotype - Texta-Light.otf",
                         "Latinotype - Texta-LightIt.otf",
                         "Latinotype - Texta-Medium.otf",
                         "Latinotype - Texta-MediumIt.otf",
                         "Latinotype - Texta-Regular.otf",
                         "Latinotype - Texta-Thin.otf",
                         "Latinotype - Texta-ThintIt.otf",
        ]
    
        fontNames.forEach{registerFont(fileName: [=10=])}
    }

    static func registerFont(fileName: String) {
        guard let gFontRef = getFont(named: fileName) else {
            print("*** ERROR: ***")
            return
    }
    
    var errorRef: Unmanaged<CFError>? = nil
        if !CTFontManagerRegisterGraphicsFont(gFontRef, &errorRef) {
            print("*** ERROR: \(errorRef.debugDescription) ***")
        }
    }

    static func getFont(named fileName: String) -> CGFont? {
        let url = Bundle.module.url(forResource: fileName, withExtension: nil)
        guard let gUrl = url,
              let gFontData = NSData(contentsOf: gUrl),
              let gDataProvider = CGDataProvider(data: gFontData),
              let gFontRef = CGFont(gDataProvider) else {
                print("*** ERROR: ***")
                return nil
    }
    
        return gFontRef
    }
}

记得在数组中添加字体文件名。

编辑:我更新了我的答案。