【问题标题】:Error loading pngs from a .bundle in Objective-c在 Objective-c 中从 .bundle 加载 png 时出错
【发布时间】:2013-03-04 12:54:00
【问题描述】:

我正在我的 Xcode 项目中构建一个框架。为了构建框架,我创建了一个聚合目标。该框架由静态库、头文件和 .png 资产包MyFrameworkResources.bundle 组成。当我构建聚合时,一切都已成功创建,并且捆绑存在于我的 Products 目录中。

在我的 Xcode 项目中还有一个目标应用程序。此应用程序用于测试框架产品(静态库、头文件和捆绑包)。我已将静态库和MyFrameworkResources.bundle 添加到目标应用程序的目标依赖项中。我还在目标应用程序的构建阶段添加了MyFrameworkResources.bundle 以复制捆绑资源。

我可以很好地使用静态库中的所有文件,但是在尝试从包中加载资源时出现错误。这就是我从包中加载资产的方式:

NSString *mainBundlePath = [[NSBundle mainBundle] resourcePath];
NSString *frameworkBundlePath = [mainBundlePath stringByAppendingPathComponent:@"MyFrameworkResources.bundle"];
NSBundle *frameworkBundle = [NSBundle bundleWithPath:frameworkBundlePath];
NSLog(@"bundle: %@", frameworkBundle);

NSError *error;
[frameworkBundle loadAndReturnError:&error]; // <-- THIS RETURNS AN ERROR
NSLog(@"error: %@", error);
UIImage *image = [UIImage imageWithContentsOfFile:[frameworkBundle pathForResource:@"AnyImage" ofType:@"tiff"]]; // <-- EDIT, USE "tiff", NOT "png"

当我记录捆绑包时,我得到了这个:

捆绑: NSBundle /Users/my_comp/Library/Application Support/iPhone Simulator/6.1/Applications/blah-blah-blah/MyApp.app/MyFrameworkResources.bundle(尚未加载)

当我记录错误时,我得到了这个:

错误: Error Domain=NSCocoaErrorDomain Code=4 "无法加载捆绑包“MyFrameworkResources”,因为无法找到其可执行文件。" UserInfo=0x7535ee0 {NSLocalizedRecoverySuggestion=尝试重新安装捆绑包。, NSLocalizedFailureReason=找不到捆绑包的可执行文件。, NSLocalizedDescription=捆绑包“MyFrameworkResources”无法加载,因为找不到它的可执行文件。, NSBundlePath=/Users /my_comp/Library/Application Support/iPhone Simulator/6.1/Applications/blah-blah-blah/MyApp.app/MyFrameworkResources.bundle}

为了仔细检查,我在电脑上 cd'd 进入 /Users/my_comp/Library/Application Support/iPhone Simulator/6.1/Applications/blah-blah-blah/MyApp.app/MyFrameworkResources.bundle 确实在那里。所以现在我很茫然。我试过清理聚合目标,清理目标Application,删除目标Application,都没有运气。

知道为什么我不能从捆绑包中加载图片吗?(抱歉,描述太长了)

仅供参考,我一直使用this great tutorial 作为构建框架和捆绑包的指南。

【问题讨论】:

  • 嗯,我认为它是相似的,但那个提问者是从互联网上下载捆绑包,而不是与应用程序一起打包。在任何情况下,我都尝试以与他们相同的方式获取包的路径(例如NSSearchPathForDirectoriesInDomains(NSApplicationDirectory, NSUserDomainMask, YES),并且看到与以前相同的错误:-/

标签: ios objective-c xcode png bundle


【解决方案1】:

啊,在为此苦苦挣扎之后,我 cd'd 进入 MyFrameworkResources.bundle 只是为了仔细检查所有资产是否都包含在内。事实证明,Xcode 将 .png 文件重命名为 .tiff 文件,并删除了视网膜资源。经过进一步调查,我发现 Xcode 会自动将视网膜和非视网膜 .png 文件合并为“一个多页 TIFF”。这是reference

解决办法,用ofType:@"tiff"代替ofType:@"png"

UIImage *image = [UIImage imageWithContentsOfFile:[frameworkBundle pathForResource:@"AnyImage" ofType:@"tiff"]];

【讨论】:

  • 另外,我在从包中加载 tiff 图像时遇到问题(一些 @2x 图像未正确渲染)。所以我尝试禁用tiffs 并改用pngs。这按预期工作。要禁用 Xcode 将 png 合并到 tiff,请转到目标包的构建设置和 COMBINE_HIDPI_IMAGESNO
猜你喜欢
  • 1970-01-01
  • 2019-01-17
  • 1970-01-01
  • 2012-03-07
  • 2017-10-17
  • 1970-01-01
  • 1970-01-01
  • 2020-05-19
  • 2016-05-01
相关资源
最近更新 更多