UIImage imageNamed:不会自动选择视网膜@ 2x图像

时间:2012-10-04 18:06:44

标签: ios ios6 retina-display

假设我在捆绑或资产目录中有三张图片:

  1. 默认〜iphone.png
  2. Default@2x~iphone.png
  3. Default-568h@2x.png
  4. 在iOS 4及更高版本中,UIImage构造函数可以采用如下图像名称:

    [UIImage imageNamed:@"Default"];
    

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

    我将图像命名为4英寸视网膜(iPhone 5)启动图像。有没有办法命名图像(3),所以当我在4英寸视网膜显示器上运行时,它会返回相同的UIImage构造函数?

    也许这还没有实现,或者我对方便性的期望过高......我只是试图避免代码中的任何条件逻辑根据屏幕尺寸选择图像。

3 个答案:

答案 0 :(得分:12)

我也遇到了同样的问题,结果发现iPhone 5 / iPod Touch第五代没有这种行为。

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

我使用此方法检查我的应用是否在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(Link)上找到了一个UIImage类,它实现了你正在寻找的东西。它没有非现有文件的后备,但您可以自己轻松实现它。

答案 1 :(得分:2)

没有4“图像类型。唯一与其他一切不同的是包含Default-568h@2x.png,它被用作iPhone 5的启动图像,并向应用程序支持的操作系统发出更长的信号屏幕,不应该是letterboxed。

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

答案 2 :(得分:0)

iOS 8中的新API允许您加载指定图像的视网膜版本,之前您必须自己确定文件名:

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

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