如何访问CocoaPods中的字体?遇初始化nil及权限问题求助
解决CocoaPods自定义字体代码初始化返回nil+权限报错问题
我之前也踩过类似的坑,结合你的情况咱们一步步拆解解决:
先搞定框架权限报错
那个PUIElementModules91.framework的权限问题是核心阻碍之一,先把它解决:
- 找到项目里
Pods目录下的这个框架文件,右键「显示简介」,在「共享与权限」板块,确保当前登录用户有读/写权限;如果没有,点击右下角的锁解锁,添加用户权限并选择「应用到包含的项目」。 - 嫌手动改麻烦的话,直接打开终端cd到项目根目录,执行:
递归修改Pods目录下所有文件的权限,确保框架能被正常访问。sudo chmod -R 755 ./Pods
排查字体加载的核心问题
虽然你已经做了不少配置,但CocoaPods的字体加载有几个容易忽略的细节:
1. 确认Podspec的资源配置正确
很多人会漏写podspec里的资源声明,导致字体没被正确打包到pod中:
- 如果字体直接放在pod的资源目录,确保podspec里有:
路径要和pod里字体的实际位置完全对应。s.resources = "YourPodName/Resources/Fonts/*.ttf" - 更推荐用
resource_bundles(避免和主app资源冲突),配置如下:
这种情况下字体存在pod的独立资源bundle里,主app的bundle不会包含,需要手动注册字体。s.resource_bundles = { "YourPodResources" => ["YourPodName/Resources/Fonts/*.ttf"] }
2. 别把字体文件名当实际字体名称!
这是最常见的错误:你代码里用的my-fonts-name可能不是字体的真实名称。
- 用Font Book打开你的TTF文件,顶部显示的名称才是代码里需要用的(比如文件名是
MyFont-Regular.ttf,实际名称可能是MyFont Regular或者MyFont-Regular)。 - 也可以在pod的初始化代码里先打印字体列表,确认是否加载成功:
// 在pod的某个初始化方法里执行 UIFont.familyNames.forEach { familyName in let fontNames = UIFont.fontNames(forFamilyName: familyName) print("[Pod Fonts] \(familyName): \(fontNames)") }
3. 手动注册字体(关键步骤)
如果字体在pod的资源bundle里,主app的info.plist配置不会生效,必须手动注册:
在你的pod里添加一个字体注册工具类:
public class YourPodFontLoader { public static func registerFonts() { let baseBundle = Bundle(for: YourPodFontLoader.self) // 如果用了resource_bundles,需要额外获取对应bundle: // guard let resourceBundleURL = baseBundle.url(forResource: "YourPodResources", withExtension: "bundle"), // let podBundle = Bundle(url: resourceBundleURL) else { // print("找不到pod资源bundle") // return // } guard let fontURLs = baseBundle.urls(forResourcesWithExtension: "ttf", subdirectory: nil) else { print("找不到pod里的字体文件") return } for url in fontURLs { CTFontManagerRegisterFontsForURL(url as CFURL, .process, nil) } } }
然后在消费项目的AppDelegate或SceneDelegate的启动方法里调用:
YourPodFontLoader.registerFonts()
4. 复用Storyboard的字体名称
既然Storyboard能正常使用字体,你可以打开Storyboard,选中用了自定义字体的控件,查看属性检查器里的「Font」字段,里面显示的名称就是代码里UIFont(name:)需要传入的参数,直接复制过来用即可。
最后验证
做完以上步骤后,重新执行pod install,清理项目(Cmd+Shift+K),重新编译运行,再打印字体列表,应该就能看到你的自定义字体了,代码初始化也不会返回nil了。
内容的提问来源于stack exchange,提问作者user9661174
相关产品推荐
相关产品推荐

