我将一个play.png图片放在我的视图上。当视图最初加载时,iPhone 4会抓取相应的play@2x.png文件,看起来很棒。但是,当我点击播放按钮时,我的代码将其交换为pause.png文件。然后,当我点击pause.png带回play.png时,它会使用原始的play.png文件(而不是我认为会自动引用的@ 2x版本)。
这是我尝试使用的代码:
[button setImage:[UIImage imageNamed:@"play.png"] forState:UIControlStateNormal];
因此,如果我在初始视图加载后交换文件,是否必须在IF语句中手动指定@ 2x版本?如果是这样,UIScreen.scale是用于此的最佳属性吗?
我目前正在使用这样的代码:
if ([UIScreen mainScreen].scale > 1.0)
{
[button setImage:[UIImage imageNamed:@"play@2x.png"] forState:UIControlStateNormal];
}
else
{
[button setImage:[UIImage imageNamed:@"play.png"] forState:UIControlStateNormal];
}
它运行正常,但在那里使用IF语句很烦人,看起来有点脆弱。
先感谢你们所有的聪明人。
答案 0 :(得分:25)
条件陈述是不必要的。以下几行就足够了:
[button setImage:[UIImage imageNamed:@"play.png"] forState:UIControlStateNormal];
在iOS 4.0中,如果设备是iPhone 4且具有视网膜显示,则imageNamed:方法会自动查找“@ 2x”文件名后缀。在以前版本的iPhone OS中,imageNamed:方法仅查找您所写的内容(即较低分辨率的图像)。这是因为iPhone 4的操作系统版本不能低于4.0,因此您的视网膜显示屏用户将始终拥有更高分辨率的艺术品。
答案 1 :(得分:7)
您可以使用:
[UIImage imageNamed:@"play"]
没有扩展名。这将加载@ 2x版本(如果可用)以及设备是否具有x2比例。
这适用于iOS4或更高版本。但是,如果要在以前的版本中运行应用程序,可以执行以下操作:
UIImage* image = [UIImage imageNamed:@"play"]; // for iOS 4 or greater
if(!image)
image = [UIImage imageNamed:@"play.png"]; // for previous iOS versions
如果Apple在任何时候创建新设备或显示器时都有@ 3x或任何其他版本,则可以使用此功能。
您可以创建一个实用程序方法,以避免在需要加载图像的任何位置执行此操作。
请参阅:Supporting High-Resolution Screens,“将图像加载到应用程序中”
部分答案 2 :(得分:4)
可能导致此问题的两个愚蠢的错误(我之前都做过):
答案 3 :(得分:3)
我遇到了同样的问题,然后意识到我的Windows Photoshop导出的.png文件是.PNG文件。显然,资本化很重要。
答案 4 :(得分:2)
我可以确认这是4.0设备的问题。问题不在于它没有加载@ 2x图像,确实如此,但仍然以72 DPI显示它(导致它模糊)。
幸运的是,这个错误已在4.1中修复(在模拟器中测试)。
答案 5 :(得分:1)
在另一个帖子中有人提到他们通过删除并重新添加他们的高分辨率图像来解决一个类似的棘手问题。
答案 6 :(得分:0)
我有类似的问题,因为文件名 - button_slice9.png和button_slice9@2x.png不起作用。
但是button_slice.png和button_slice@2x.png在imageNamed中按预期工作:。
答案 7 :(得分:0)
我遇到了类似的问题需要一段时间来弄明白。事实证明,我的@ 2x图像不知何故未添加到我的应用目标中,因此它们没有被打包。
答案 8 :(得分:0)
当我用高分辨率icon-close@2x.png替换低分辨率icon-close.png时,我遇到了类似的问题。 iPad版本似乎忽略了“@ 2x”并将图像加载到双倍大小且scale = 1.0。删除文件并添加回来没有帮助。将其重命名为“icon-leave@2x.png”。关于icon-close.png
的某些错误信息缓存在某处