如何使用 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 工作区中生成的框架中的自定义字体的主要内容,如果未能解决你的问题,请参考以下文章
Xcode 6 大小类中的自定义字体大小无法与自定义字体一起正常工作
受益于 Play 中生成的 getter 和 setter!框架