NSBundle pathForResource:ofType:和UIImage imageWithContentsOfFile:处理比例和设备修饰符?

时间:2012-06-18 21:01:07

标签: ios uiimage retina-display nsbundle

在我的iOS资源文件夹中,我有图像:

foo~iphone.png
foo@2x~iphone.png
foo~ipad.png
foo@2x~ipad.png

我加载它们:

NSString *fileName = [[NSBundle mainBundle] pathForResource:@"foo" ofType:@"png"];
UIImage *image = [UIImage imageWithContentsOfFile:fileName];

实验:

在iPhone上,filename/path/to/bundle/foo~iphone.png,在视网膜iPhone上,它会加载@2x版本。

在iPad上,filename/path/to/bundle/foo~ipad.png,在视网膜iPad上,它会加载@2x版本。

也就是说,它会加载我希望的图像,但pathForResource会处理设备修改器,而imageWithContentsOfFile会处理缩放修改器。

我想知道原因。 pathForResource的{​​{3}}对设备修饰符一无所知,imageWithContentsOfFile的{​​{3}}对缩放修饰符一无所知。

是否有单独的文档准确显示每个函数的作用?

1 个答案:

答案 0 :(得分:14)

imageWithContentsOfFile的解释位于related documentation,而不是UIImage文档本身:

  

在具有高分辨率屏幕的设备上,imageNamed:,imageWithContentsOfFile:和initWithContentsOfFile:方法会自动查找所请求图像的版本,其名称中包含@ 2x修饰符。如果找到一个,则会加载该图像。如果您未提供给定图像的高分辨率版本,则图像对象仍会加载标准分辨率图像(如果存在)并在绘图期间对其进行缩放。

     

当加载图像时,UIImage对象会根据图像文件的后缀自动将大小和比例属性设置为适当的值。对于标准分辨率图像,它将scale属性设置为1.0,并将图像的大小设置为图像的像素尺寸。对于文件名中带有@ 2x后缀的图像,它将scale属性设置为2.0,并将width和height值减半,以补偿比例因子。这些减半的值与您需要在逻辑坐标空间中用于渲染图像的基于点的尺寸正确相关。“

我不知道哪个文档解释了pathForResource的行为。