从 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
}
}
记得在数组中添加字体文件名。
编辑:我更新了我的答案。
我想知道目前是否有办法从 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
}
}
记得在数组中添加字体文件名。
编辑:我更新了我的答案。