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);
- 确认资源打包配置
- 检查字体文件的
Target Membership是否已勾选所有需要的目标; - 进入
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
相关产品推荐
相关产品推荐

