You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS自定义字体仅在Interface Builder添加控件后才生效?求助

iOS自定义字体加载异常排查方案

针对你遇到的“仅在Storyboard中存在使用该字体的控件时,字体才会被加载”的问题,可从以下几个方向排查解决:

  • 手动预加载字体文件
    Xcode的编译优化可能会剔除没有被代码/Storyboard直接引用的资源文件。你可以在AppDelegate的application:didFinishLaunchingWithOptions:方法中手动注册字体,强制触发加载:
NSString *fontPath = [[NSBundle mainBundle] pathForResource:@"CONSELHEIRO" ofType:@"otf" inDirectory:@"fonts"];
NSData *fontData = [NSData dataWithContentsOfFile:fontPath];
CFErrorRef error = NULL;
CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)fontData);
CGFontRef font = CGFontCreateWithDataProvider(provider);

if (CTFontManagerRegisterGraphicsFont(font, &error)) {
    NSLog(@"字体预加载成功");
} else {
    CFStringRef errorDesc = CFErrorCopyDescription(error);
    NSLog(@"字体加载失败: %@", (__bridge NSString *)errorDesc);
    CFRelease(errorDesc);
}

CFRelease(font);
CFRelease(provider);
  • 确认资源打包配置
  1. 检查字体文件的Target Membership是否已勾选所有需要的目标;
  2. 进入Build Phases > Copy Bundle Resources,手动添加fonts/CONSELHEIRO.otf,确保Xcode不会因为“未检测到引用”而跳过该资源的打包。
  • 验证Info.plist路径正确性
    确保Fonts provided by application数组中的条目是完整路径:fonts/CONSELHEIRO.otf,注意路径大小写要和实际文件系统完全一致(iOS对资源路径大小写敏感)。

  • 核对字体内部元数据
    用Font Book打开CONSELHEIRO.otf,查看其PostScript名称和字体族名称。有时字体文件的内部名称与文件名不一致,导致UIFont无法识别。可以用CTFontManagerCopyAvailableFonts()获取系统已加载的所有字体信息,对比你使用的名称是否匹配。

  • 临时禁用编译优化测试
    将Build Settings > Optimization Level改为None [-O0],重新编译运行。如果字体能正常加载,说明是Xcode的优化机制误判了资源使用情况。此时可以在代码中添加一个静态变量持有字体路径,让Xcode认为该资源被引用:

static NSString *const kCustomFontMarker = @"fonts/CONSELHEIRO.otf";

不需要实际使用这个变量,仅作为引用标记即可。

内容的提问来源于stack exchange,提问作者user717452

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 17:00:30