13

I place a play.png image onto my view. When the view initially loads, the iPhone 4 grabs the corresponding play@2x.png file and it looks great. However, when I tap the play button my code swaps it out for the pause.png file. Then, when I tap the pause.png to bring back the play.png it uses the original play.png file (not the @2x version like I thought it would automatically reference).

This is the code I tried to use:

[button setImage:[UIImage imageNamed:@"play.png"] forState:UIControlStateNormal];

So, if I swap files after the initial view load, do I have to manually specify the @2x version inside an IF statement? If so, is the UIScreen.scale the best attribute to use for this?

I'm currently using code like this:

if ([UIScreen mainScreen].scale > 1.0) 
{ 
    [button setImage:[UIImage imageNamed:@"play@2x.png"] forState:UIControlStateNormal]; 
} 
else 
{ 
    [button setImage:[UIImage imageNamed:@"play.png"] forState:UIControlStateNormal]; 
}

It's working fine but having the IF statement in there is annoying and seems a little fragile.

Thanks in advance to all you smarties out there.

4

9 回答 9

25

条件语句是不必要的。以下行就足够了:

[button setImage:[UIImage imageNamed:@"play.png"] forState:UIControlStateNormal];

在 iOS 4.0 中,如果设备是 iPhone 4 并且具有视网膜显示屏,则 imageNamed: 方法会自动查找“@2x”文件名后缀。在以前版本的 iPhone OS 中,imageNamed: 方法只查找您编写的内容(即较低分辨率的图像)。这是因为 iPhone 4 的操作系统版本不能低于 4.0,因此您的 Retina 显示器用户将始终拥有更高分辨率的图稿。

于 2010-08-11T19:31:12.200 回答
8

您可以只使用:

[UIImage imageNamed:@"play"]

没有扩展名。如果可用并且设备具有 x2 比例,这将加载 @2x 版本。

这适用于 iOS4 或更高版本。但是,如果您想在以前的版本中运行您的应用程序,您可以执行以下操作:

UIImage* image = [UIImage imageNamed:@"play"]; // for iOS 4 or greater
if(!image)
    image = [UIImage imageNamed:@"play.png"]; // for previous iOS versions

好处是,如果您在任何时候拥有@3x 或任何其他版本(如果 Apple 创建新设备或显示器),这将起作用。

您可以创建一个实用程序方法来避免在需要加载图像的任何地方执行此操作。

请参阅:支持高分辨率屏幕,“将图像加载到您的应用程序”部分

于 2010-09-27T14:27:38.383 回答
4

两个可能导致此问题的愚蠢错误(我之前都犯过):

  1. 不小心将小版本命名为 @2x 而不是大版本
  2. 让大版本稍微错开(一个像素)
于 2010-09-17T06:03:06.190 回答
3

我遇到了同样的问题,然后意识到我的 Windows Photoshop 导出的 .png 文件是 .PNG 文件。显然,大小写确实很重要。

另请参阅标签栏项目未拾取高分辨率@2x 图像

于 2010-08-22T22:34:19.120 回答
2

我可以确认这是 4.0 设备的问题。问题不在于它不加载 @2x 图像,它确实如此,但仍以 72 DPI 显示它(导致它模糊)。

幸运的是,这个错误在 4.1 中得到修复(在模拟器中测试)。

于 2011-05-11T18:42:26.023 回答
1

另一个线程上的某个人提到,他们设法通过删除高分辨率图像并将其重新添加到项目中来解决类似的棘手问题。

于 2010-08-14T16:13:26.980 回答
0

我只是有一个类似的问题,需要一段时间才能弄清楚。事实证明,我的 @2x 图像不知何故没有添加到我的应用程序目标中,因此它们没有被打包。

于 2012-03-15T17:50:58.140 回答
0

由于文件名,我遇到了类似的问题 - button_slice9.png 和 button_slice9@2x.png 不起作用。

但是 button_slice.png 和 button_slice@2x.png 在 imageNamed: 中按预期工作。

于 2012-01-26T11:41:15.813 回答
0

当我用高分辨率 icon-close@2x.png 替换低分辨率 icon-close.png 时,我遇到了类似的问题。iPad 构建似乎忽略了“@2x”并以双倍尺寸加载图像,比例 = 1.0。删除文件并重新添加没有帮助。将其重命名为“icon-leave@2x.png”。一些关于 icon-close.png 的错误信息缓存在某处

于 2013-01-09T02:20:57.267 回答