UIImage imageNamed:不能自动选择retina @2x图片。

12

假设我有三张图片存储在bundle或asset目录中:

  1. Default~iphone.png
  2. Default@2x~iphone.png
  3. Default-568h@2x.png

在iOS 4及以上版本中,可以使用UIImage构造函数如下传递图片的名称:

[UIImage imageNamed:@"Default"];

在3.5英寸的Retina显示屏(iPhone)上,它会自动选择图像(2)。如果在非Retina显示器上,则选择(1)。这很好。

我将图像3命名为4英寸Retina(iPhone 5)启动图像所指定的名称。是否有一种方法来命名图像(3),以便在运行于4英寸Retina显示屏时,返回相同的UIImage构造函数?

也许这还没有实现,或者我对这种方便性期望过高...我只是想避免根据屏幕尺寸选取图像时需要写条件判断的代码。

3个回答

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上发现了一个UIImage类别 (链接),它实现了你要找的内容。它没有非存在文件的回退,但你可以轻松地自己实现。


+1 这是一个很棒的类别。感谢提供链接。然而,从技术上讲,它已经为不存在的图像提供了备用方案 - 它只是使用传递的原始名称字符串返回 `UIImage imageNamed:' 方法。在这种情况下,这对我来说是期望的行为,这是有意义的。 - JRG-Developer
那正是我想的。最终我做了一个类似的UIImage分类。 - JoelF

2

没有4英寸的图像类型。唯一与其他所有内容不同的是包含Default-568h@2x.png,它用作iPhone 5的启动图像,并向操作系统发出信号,表明您的应用程序支持更长的屏幕,并且不应该使用“信封式”留白。

您需要使用代码或自动布局处理不同的屏幕尺寸。没有特殊的自动图像类型。它仍然是标准屏幕图像类型或视网膜图像类型,就像自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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接