iOS的图像资源

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

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

我所做的是:

  NSString * imageName = ... ; NSLog(@"imageName: %@", imageName); UIImage * someImage = [UIImage imageNamed: imageName]; 

另外我fave辅助方法,返回捆绑资源:

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

我已经尝试以下imageName

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

在这种情况下,我对imageNamenull

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

在这种情况下,执行图像path返回,但它只适用于,如果我使用imageWithContentsOfFile而不是imageNamed ,并没有采取适当的资源:它加载视网膜资源,尽pipe屏幕的types。

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

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

没有得到加载。

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

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

你有没有试图简单地加载图像使用:

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

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

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

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

XCode结合高分辨率的艺术作品

在最新版本的XCode中,进入编辑器菜单,然后select“validation设置”,这应该删除该艺术品组合。

多页TIFF仅适用于OSX; 他们不在 iOS上工作

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

您需要打开生成外部资源包项目 ,select目标,转到生成设置,然后部署子标题,并将“合并高分辨率图稿”设置为否。然后重新编译外部资源包。

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

如果你正在使用捆绑而不是去

– >build立设置 – > COMBINE_HIDPI_IMAGES为NO,

而你只需要清理和构build!

– >build立设置 – > COMBINE_HIDPI_IMAGES到NO

这是唯一可行的解​​决scheme,不需要其他更改

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

您应该保存以下内容:

  • 例如〜iphone.png – >这是非视网膜iPhone
  • 例如~iphone@2x.png – >这是视网膜iPhone
  • 例如〜ipad.png – >这是非视网膜iPad
  • 例如~ipad@2x.png – >这是iPad的视网膜

所以,从你调用它的地方来说并不重要,你可以这样调用它,假设myImageView是一个UIImageView对象:

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

苹果强烈build议你使用PNG图像。 而且,OS负责为所需的设备find正确的图像。 你不必担心findpath和所有的东西。 +(UIImage*)imageNamed:(NSString*)name在您的资源包中查找正确的图像 – 顺便说一句,只要调用[NSBundle mainBundle];