在代码中指定图像时,不使用Retina图标(@ 2x)

nic*_*son 13 iphone ios4 retina-display

我将一个play.png图像放在我的视图上.当视图最初加载时,iPhone 4会抓取相应的play@2x.png文件,看起来很棒.但是,当我点击播放按钮时,我的代码将其交换为pause.png文件.然后,当我点击pause.png带回play.png时,它会使用原始的play.png文件(而不是我认为会自动引用的@ 2x版本).

这是我试图使用的代码:

[button setImage:[UIImage imageNamed:@"play.png"] forState:UIControlStateNormal];
Run Code Online (Sandbox Code Playgroud)

因此,如果我在初始视图加载后交换文件,是否必须在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]; 
}
Run Code Online (Sandbox Code Playgroud)

它工作正常,但在那里有IF声明很烦人,似乎有点脆弱.

在此之前,感谢所有的聪明人.

Ars*_*yev 25

条件陈述是不必要的.以下行就足够了:

[button setImage:[UIImage imageNamed:@"play.png"] forState:UIControlStateNormal];
Run Code Online (Sandbox Code Playgroud)

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


gim*_*ete 7

你可以使用:

[UIImage imageNamed:@"play"]
Run Code Online (Sandbox Code Playgroud)

没有扩展名.这将加载@ 2x版本(如果可用)以及设备是否具有x2比例.

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

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

好处是,如果Apple在任何时刻拥有@ 3x或任何其他版本,如果Apple创建新设备或显示器,这将有效.

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

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


Mar*_*ius 2

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

幸运的是这个bug在4.1中被修复(在模拟器中测试)。