Xcode 14中资源未从资源目录加载问题求助
字体加载问题修复(最小代码改动优先)
方案1:调整资源存放位置(无需修改代码)
将字体文件从Assets.xcassets资源目录中移出,直接拖入项目根目录或任意非资源目录的文件夹,然后在Build Phases → Copy Bundle Resources中确认这些字体已被添加。新版构建系统会将这类资源直接放置在主Bundle根目录,与旧版构建系统行为完全一致,原有的[UIFont fontWithName:@"MyFontName" size:14.0]代码可正常运行。
方案2:使用正确的字体名称(若保留在Assets.xcassets中)
通过xcrun --sdk iphoneos assetutil --info MyApp.app/Assets.car命令输出,找到对应字体的"FontName"字段(注意:该名称通常与字体文件名不同,例如文件名MyFont.ttf对应的实际字体名可能是MyFont-Regular),将代码中的MyFontName替换为这个正确名称。
若替换名称后仍无法加载,可手动注册字体:
// 从主Bundle获取Assets.car路径 NSURL *assetCarURL = [[NSBundle mainBundle] URLForResource:@"Assets" withExtension:@"car"]; // 注册Assets.car中的所有字体 BOOL success = CTFontManagerRegisterFontsForURL(assetCarURL, kCTFontManagerScopeProcess, NULL); if (!success) { NSLog(@"字体注册失败"); }
注册后再调用原有的fontWithName方法即可。
其他类型资源的通用修复
对于图片、音频等资源,同样推荐采用移出Assets.xcassets的方式:将资源直接放在项目目录并加入Copy Bundle Resources,旧代码中[UIImage imageNamed:@"MyImage"]、[NSBundle pathForResource:@"MyAudio" ofType:@"mp3"]等加载逻辑可直接复用。
若坚持将资源保留在Assets.xcassets中:
- 图片:确保使用
[UIImage imageNamed:@"MyImage"]加载(该方法会自动从Assets.car中查找资源),避免通过文件路径直接读取。 - 自定义资源:通过Asset Catalog API获取资源,示例代码:
UIImageAsset *asset = [[UIImageAsset alloc] initWithName:@"CustomResource"]; UIImage *resourceImage = [asset imageWithTraitCollection:[UITraitCollection traitCollectionWithDisplayScale:[UIScreen mainScreen].scale]];
批量兼容设置(可选)
若项目中有大量资源需要保持旧版构建系统的行为,可修改项目Build Settings:
搜索Asset Catalog Compiler Options,将Embed Asset Packs In Product Bundle设置为YES,部分资源会被提取到Bundle根目录而非仅打包进Assets.car(注:该设置无法完全复刻旧版行为,仍需部分验证)。
内容的提问来源于stack exchange,提问作者Yevgeniy Logachev

