28

我可能在这里遗漏了一些明显的东西,但我一直无法解决以下问题:

我有一个项目,其中包含普通屏幕和视网膜屏幕的图像资源,例如someimage.pngsomeimage@2x.png,它们存储在单独的包中。当我构建项目时,Xcode 会自动将它们打包到单个多页 tiff ( imageName.tiff) 中,我已经在 finder 中检查了它——它实际上是包含两个图像的多页 tiff。然而,这里出现了一个问题:我很难加载适当的资源。

我要做的是:

    NSString * imageName = ... ;

    NSLog(@"imageName: %@", imageName);

    UIImage * someImage = [UIImage imageNamed: imageName];

我也喜欢辅助方法,它返回捆绑资源:

   +(NSBundle *) resourcesBundle
   {
         NSBundle *bundle = [NSBundle bundleWithURL:[[NSBundle mainBundle] URLForResource:@"MyResourcesBundle" withExtension:@"bundle"]];
         return bundle;
   }

我试过以下imageName

imageName = [[AuxClass resourcesBundle] pathForResource:@"someimage" ofType:@"png"];

在这种情况下,我nullimageName

imageName = [[AuxClass resourcesBundle] pathForResource:@"someimage" ofType:@"tiff"];

在这种情况下,实际图像路径被返回,但它仅在我使用imageWithContentsOfFile而不是时才有效imageNamed,并且它不占用适当的资源:尽管屏幕类型不同,但它会为视网膜加载资源。

如果我省略了文件类型(就像我在添加@2x资源之前所做的那样,它工作正常,并且是我尝试的第一件事并且确信它会工作)

imageName = [NSString stringWithFormat: @"%@/%@",
                                  @"MyResourcesBundle.bundle"",
                                  @"someimage" ];

什么都没有加载。

添加“.tiff”扩展名具有相同的效果pathForResource:- 加载视网膜资源,不考虑非视网膜屏幕的资源。

那么我错过了什么?加载图像的正确方法是什么?

4

5 回答 5

46

您是否尝试过使用以下方法简单地加载图像:

UIImage * someImage = [UIImage imageNamed: @"someimage"];

(假设您的项目中有一个名为“someimage”的图像,例如 someimage.png)

该代码将根据平台自动选择视网膜/非视网膜版本。

如果问题是创建了 TIFF,请检查:

XCode 结合高分辨率艺术品

在最新版本的 XCode 中,转到编辑器菜单,然后选择“验证设置”,这应该会删除该艺术品组合。

于 2012-09-03T08:49:02.523 回答
11

多页 TIFF 仅适用于 OSX;它们不适用于 iOS。

因此,您需要停止尝试访问本质上无法访问的资源,并以正确的方式做事!

您需要打开生成外部资源包的项目,选择目标,进入构建设置然后部署子标题,并将“组合高分辨率艺术品”设置为否。然后重新编译外部资源包。

在您的主项目中,您现在应该能够以正常方式读取 PNG。

于 2012-09-03T09:52:32.010 回答
10

如果您正在使用捆绑包而不是转到

-> 构建设置 -> COMBINE_HIDPI_IMAGES 为 NO,

你只需要清洁和建造!

于 2013-04-10T10:07:14.240 回答
2

-> 构建设置 -> COMBINE_HIDPI_IMAGES 为 NO

这是唯一有效的解决方案,无需进行其他更改

于 2013-07-16T14:39:50.377 回答
1

当您为您的应用程序创建图像时,假设您正在创建一个名为example.

您应该保存以下内容:

  • example~iphone.png -> 这是针对非视网膜 iPhone
  • 示例~iphone@2x.png -> 这是针对视网膜 iPhone
  • example~ipad.png -> 这是针对非视网膜 iPad
  • 示例~ipad@2x.png -> 这是针对 Retina iPad 的

所以,从哪里调用它并不重要,只要这样调用它,假设 myImageView 是一个 UIImageView 对象:

[myImageView setImage:[UIImage imageNamed:@"example"]];

Apple 强烈建议您使用 png 图像。此外,操作系统负责为所需设备找到正确的图像。您无需担心找到路径和所有这些东西。+(UIImage*)imageNamed:(NSString*)name在您的资源包中查找正确的图像 - 顺便说一下,返回资源包只需调用[NSBundle mainBundle];

于 2012-09-03T08:53:55.437 回答