Kotlin Multiplatform项目iOS端自定义字体不显示问题
KMM自定义字体iOS端不加载问题解决
问题原因
iOS端未正确配置字体资源,导致Typeface.makeFromName无法找到目标字体,系统自动回退到默认的Helvetica字体。
解决步骤
1. 正确配置iOS项目中的字体文件
- 将自定义字体文件(如
knight.ttf)复制到iOS应用的Resources目录下(建议创建Fonts子目录统一管理) - 在Xcode中选中字体文件,确保Target Membership已勾选当前iOS应用目标(否则字体不会被打包到应用中)
- 打开
Info.plist,添加Fonts provided by application(对应键名UIAppFonts)数组项,将字体的完整文件名(如knight.ttf)添加到数组里
2. 修正iOS端字体加载代码
iOS加载字体需要使用字体的PostScript名称(不是文件名),你可以通过两种方式获取:
- 用Mac自带的Font Book打开字体文件,查看
PostScript名称(在字体信息面板中) - 临时在iosMain中添加代码打印所有可用字体,找到目标字体的名称:
UIFont.familyNames.forEach { familyName -> UIFont.fontNames(forFamilyName = familyName).forEach { fontName -> println("可用字体: $fontName") } }
修改iosMain/CustomFonts.kt代码,替换为正确的PostScript名称:
private fun loadCustomFont(postScriptName: String): Typeface { return Typeface.makeFromName(postScriptName, FontStyle.NORMAL) } actual val knightFontFamily get() = FontFamily(Typeface(loadCustomFont("Knight-Regular"))) // 替换为你的字体PostScript名称
如果上述方式仍有问题,可直接从文件加载字体(更可靠):
actual val knightFontFamily: FontFamily get() { val fontFileName = "knight" val fontExtension = "ttf" val fontPath = NSBundle.mainBundle.pathForResource(fontFileName, fontExtension) ?: error("找不到字体文件: $fontFileName.$fontExtension") val fontData = NSData.dataWithContentsOfFile(fontPath) val provider = CGDataProviderCreateWithCFData(fontData) val cgFont = CGFontCreateWithDataProvider(provider) return FontFamily(Typeface(cgFont)) }
3. 验证加载结果
运行iOS应用后,重新打印字体信息,如果输出的familyName为你的自定义字体名称,说明加载成功。
内容的提问来源于stack exchange,提问作者Bedirhan Dağ
相关产品推荐
相关产品推荐

