适用于iOS的图像资源

时间:2012-09-03 08:37:55

标签: objective-c ios xcode png tiff

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

我有一个包含普通和视网膜屏幕图像资源的项目,例如 someimage.png someimage@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"];

在这种情况下,我null imageName。{/ p>

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

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

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

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

没有任何东西被加载。

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

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

5 个答案:

答案 0 :(得分:46)

您是否尝试使用以下方式加载图片:

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

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

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

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

XCode Combine high-resolution artwork

在最新版本的XCode中,转到编辑器菜单,然后选择"验证设置",这将删除该图稿组合。

答案 1 :(得分:11)

多页TIFF仅适用于OSX;他们在iOS上无法运作

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

您需要打开生成外部资源包的项目,选择目标,转到Build Settings,然后选择Deployment子标题,并将“Combine High Resolution Artwork”设置为No.然后重新编译外部资源包。

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

答案 2 :(得分:8)

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

  

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

你需要清理和构建!

答案 3 :(得分:2)

- >构建设置 - > COMBINE_HIDPI_IMAGES为NO

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

答案 4 :(得分:1)

在为应用创建图片时,假设您正在创建名为example的图片。

您应该保存以下内容:

  • example~iphone.png - >这是非视网膜iPhone
  • example~iphone@2x.png - >这是视网膜iPhone
  • example~ipad.png - >这是非视网膜iPad
  • example~ipad@2x.png - >这是视网膜iPad

所以,你调用它的位置并不重要,你只需这样调用它,假设myImageView是一个UIImageView对象:

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

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