2012-10-04 57 views
12

比方说,我有一个包或资产目录三幅影像:的UIImage imageNamed:不会自动地挑选视网膜@ 2X图像

  1. 默认〜iphone.png
  2. [email protected]~iphone.png
  3. [email protected]

在iOS 4和以后,UIImage的构造可以采取的图像名称如下:

[UIImage imageNamed:@"Default"]; 

当我在3.5英寸的视网膜显示屏(iphone)上时,它会自动选择图像(2)。如果在非视网膜显示器上选择(1)。这很棒。

我为4英寸视网膜(iPhone 5)启动图像指定了图像3。有没有一种方法来命名图像(3),以便当我在4英寸的视网膜显示屏上运行时,它会使用相同的UIImage构造函数返回?

也许这还没有实现,或者我期望从方便中得到太多......我只是想避免我的代码中的任何条件逻辑根据屏幕尺寸选择图像。

回答

12

我也有同样的问题,事实证明,没有这样的行为iPhone 5/iPod Touch第5代。

您必须手动确定您的应用程序是否在此类设备上运行,并相应地更改文件名。

我用这个方法来检查,如果我的应用程序在iPhone上运行5/iPod Touch的第五代:

#define IS_PHONEPOD5() ([UIScreen mainScreen].bounds.size.height == 568.0f && [UIScreen mainScreen].scale == 2.f && UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) 

然后你就可以调整图像的名字是这样的:

if(IS_PHONEPOD5()) { 
    myImageView.image = [UIImage imageNamed:@"MyImage-568h.png"]; 
} else { 
    myImageView.image = [UIImage imageNamed:@"MyImage.png"]; 
} 

更新
我还在github上发现了一个UIImage类(Link),它实现了您要查找的内容。它不具备非现有文件的回退功能,但您可以自己轻松实现。

+0

+1这是一个很大的范畴。感谢您的链接。但是,从技术上讲,它已经对非现有图像有一个回退 - 它只是返回'UIImage imageNamed:'方法,而不管原始名称字符串是否传入。这对我来说在这种情况下是理想的行为。 –

+0

这就是我的想法。我最终做出了类似的UIImage类别。 – JoelF

2

没有4“图像类型,唯一不同于其他任何东西的是包含[email protected],它被用作iPhone 5的启动图像,并向操作系统发出信号表明您的应用程序支持更长的屏幕,并且应该不要使用letterboxed

您必须使用不同的屏幕尺寸处理代码或自动布局,没有特殊的自动图像类型,它既可以是标准屏幕图像类型,也可以是视网膜图像类型,与之前一样自iOS 4以来。

0

在iOS 8的新API允许您加载一个名为图像的视网膜版本,以前你必须自己确定的文件名:

UIImage* retinaImage = [UIImage imageNamed:@"ImageName" 
    inBundle:nil compatibleWithTraitCollection:nil]; 

NSLog(@"screen scale: %2.2f retinaImage: %@", 
    [UIScreen mainScreen].nativeScale, retinaImage);