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

Jes*_*der 15 uiimage nsbundle ios retina-display

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

foo~iphone.png
foo@2x~iphone.png
foo~ipad.png
foo@2x~ipad.png
Run Code Online (Sandbox Code Playgroud)

我加载它们:

NSString *fileName = [[NSBundle mainBundle] pathForResource:@"foo" ofType:@"png"];
UIImage *image = [UIImage imageWithContentsOfFile:fileName];
Run Code Online (Sandbox Code Playgroud)

实验:

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

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

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

我想知道为什么.该文件pathForResource只字未提设备修饰符,以及文档imageWithContentsOfFile只字未提规模修饰.

是否有单独的文档准确指出每个功能的作用?

Mar*_*kle 14

解释imageWithContentsOfFile是在相关文档中,而不是在UIImage文档本身:

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

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

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