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

15

在我的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,而在retina iPhone上,它会加载@2x版本。

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

也就是说,它会加载我所希望的图片,但是pathForResource处理设备修饰符,而imageWithContentsOfFile处理比例修饰符。

我想知道原因。 pathForResource文档没有提到设备修饰符,而imageWithContentsOfFile文档没有提到比例修饰符。

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


当您在UIImage行上设置断点时,fileName字符串保存了什么值?换句话说,您如何知道缩放是在imageWithContentsOfFile中发生的? - Mark McCorkle
@MarkM,就像我说的,在iPhone上,“filename”是“/path/to/bundle/foo~iphone.png”,所以我知道它只获取非@2x版本的名称。当这个名称被输入到“UIImage”中时,我会得到高分辨率版本。 - Jesse Beder
1个回答

14
imageWithContentsOfFile的解释在其本身的UIImage文档中没有,可以参考相关文档。在高分辨率屏幕设备上,imageNamed:imageWithContentsOfFile:initWithContentsOfFile:方法会自动查找带有@2x修饰符的版本。如果找到,则加载该图像,否则仍会加载标准分辨率图像(如果存在),并在绘制期间进行缩放。在加载图像时,UIImage对象会根据文件名后缀自动设置大小和比例属性。对于标准分辨率图像,它将比例属性设置为1.0,并将图像大小设置为像素尺寸。对于文件名带有@2x后缀的图像,它将比例属性设置为2.0,并将宽度和高度值减半以补偿比例因子。这些减半的值正确地对应于您需要在逻辑坐标空间中使用的点坐标维度来呈现图像。关于pathForResource的行为说明我不清楚是在哪个文档中。

请引用文档。我似乎无法在整个UIImage文档或特定的imageWithContentsOfFile文档中找到有关缩放的信息。 - Jesse Beder
我也对pathForResource为什么处理设备修饰符感兴趣。 - Jesse Beder
我的答案已更新,包括引用文档中关于不同UIImage方法及其操作原理的内容。其中还讨论了设备修饰符。如果您想了解更多信息,我建议观看WWDC视频,因为它们提供了所有这些技术的示例和实现。 - Mark McCorkle
谢谢,我稍微编辑了你的答案 - 如果你不喜欢可以随意调整。对于 pathForResource 问题有什么想法吗?(我真的在寻找文档,而不是例子视频。) - Jesse Beder
我会四处搜索看看能找到什么。我同意,苹果在WWDC期间往往会提供比实际文档更深入的解释和技术。这是我从App Store第一天开始就一直遇到的共同主题。虽然观看他们的视频可能是一个耗时的过程,但我确实通过观看他们的示例并跟随他们的逻辑路径学习了高级技术以及良好的习惯。有些示例是复杂的,只是为了展示不同的技术来达到最终结果,即使它可能不是“最佳”解决方案。 - Mark McCorkle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接