我可能在这里遗漏了一些明显的东西,但我无法解决以下问题:
我有一个包含普通和视网膜屏幕图像资源的项目,例如 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:
具有相同的效果 - 加载视网膜资源,忽略非视网膜屏幕的资源。
那我错过了什么?加载图像的正确方法是什么?
答案 0 :(得分:46)
您是否尝试使用以下方式加载图片:
UIImage * someImage = [UIImage imageNamed: @"someimage"];
(假设您的项目中有一个名为' someimage'的图片,例如someimage.png)
该代码将根据平台自动选择视网膜/非视网膜版本。
如果问题是创建了TIFF,请检查:
在最新版本的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
的图片。
您应该保存以下内容:
所以,你调用它的位置并不重要,你只需这样调用它,假设myImageView是一个UIImageView对象:
[myImageView setImage:[UIImage imageNamed:@"example"]];
Apple强烈建议您使用png图像。此外,操作系统负责为所需设备查找正确的图像。您无需担心找到路径和所有内容。 +(UIImage*)imageNamed:(NSString*)name
在资源包中查找正确的图片 - 顺便说一句,要使用您的资源返回包,只需致电[NSBundle mainBundle];