SpriteKit中自定义字体无法通过代码加载问题求助
这种情况我之前在SpriteKit项目里也踩过坑,核心原因基本都是Xcode没有把自定义字体正确打包进App Bundle——毕竟Xcode会做“智能优化”,如果它没检测到你在Storyboard或代码里明确引用了字体,就会跳过打包步骤。下面是几个排查和解决的方向:
检查Info.plist的字体配置
确保Info.plist里的Fonts provided by application(或者键名UIAppFonts)数组中,已经准确添加了你的字体文件名(比如Players-Bold.ttf,注意是文件名不是字体显示名)。如果字体放在子文件夹里,还要加上相对路径,比如Fonts/Players-Bold.ttf。确认字体文件的Target Membership
选中你的字体文件(在Xcode的项目导航里),打开右侧的属性面板,检查Target Membership下是否勾选了当前的App Target。很多时候拖入字体文件时,这个选项会被默认忽略,导致字体没被打包。强制Xcode打包字体(破解Storyboard依赖)
你遇到的“留着Storyboard标签就正常”的问题,本质是Xcode通过Storyboard的引用识别到需要打包字体。要摆脱这个依赖,可以:- 加一个隐藏的占位Label:在Storyboard里随便放个Label,设置成
hidden = true或者移到屏幕外,字体选Players-Bold。Xcode会因为这个引用把字体打包进去,代码里就能正常调用了。 - 或者在代码里加个无意义的引用:在App启动的地方(比如
AppDelegate或者SceneDelegate)加一行let _ = UIFont(name: "Players-Bold", size: 12),让编译器知道你用到了这个字体,避免被优化掉。
- 加一个隐藏的占位Label:在Storyboard里随便放个Label,设置成
验证字体是否在Bundle中
可以在App启动后打印Bundle里的所有字体文件,确认你的字体是否被正确打包:if let fontPaths = Bundle.main.paths(forResourcesOfType: "ttf", inDirectory: nil) { print("打包的字体文件:\(fontPaths)") }如果输出里看不到你的
Players-Bold.ttf,就回到前两步检查配置。最后再确认字体的正确名称
有时候字体的文件名和实际的字体名称不一致(比如文件名是Players-Bold.ttf,但实际字体名是Players Bold)。可以用下面的代码打印所有可用字体,找到你的字体对应的正确名称:for familyName in UIFont.familyNames { print("字体家族:\(familyName)") for fontName in UIFont.fontNames(forFamilyName: familyName) { print(" 字体名称:\(fontName)") } }运行后搜索
Players相关的条目,确保代码里的scoreLabel.fontName用的是输出里的准确名称。
内容的提问来源于stack exchange,提问作者5AMWE5T

