Xcode 6 设备特定资源目录

31

我正在尝试更新我的应用程序以适配新的 iPhone 6 和 6+ 设备。

我已经添加了适用于新 iPhone 尺寸(6 和 6+)的启动图像。在资产目录中为 6 和 6+ 都进行了条目设置,没有问题。

我还需要添加一些全屏视图叠加图像。我已经有了这些图像的@2x(iPhone 4s)和 R4(iPhone 5 5s 5c)版本。我已经创建了新分辨率尺寸的图像,但我不知道如何将它们添加到图片集中。

当我进入资产目录时,我可以在图像集中选择设备特定选项,并看到 iPhone、retina-4 和 iPad 的条目。拖放口可用于 1x、2x、Retina 4 2x 和 3x。

我的问题是:我应该将 iPhone 6 的图像放在哪里?显然 3x 是针对 6 Plus 的。我不明白如何使用 retina-4 口同时适用于 iPhone 5 和 iPhone 6,因为屏幕尺寸不同。

我错过了什么吗?


也许可以扩展一下关于Xcode 6及以上版本的问题的主题?(请查看我的答案以了解我为什么建议这样做) - Julian
5个回答

6
我相信这是Xcode 6中的一个错误。当您从资源目录中加载图像集时,无论您是在缩放模式还是标准显示模式下,在iPhone 6+上始终会获取3x条目。对于iPhone 6,在两种模式下都会获取2x条目。对于iPhone 4s,您还将获取2x条目。 所有这些设备都具有不同的缩放比例和宽高比,因此这对于像素精确图像来说是不可接受的。我的所有图像都是全屏幕并用作覆盖,因此在缩放模式下看到了不正确的放置。
我通过创建两个图像集来解决这个问题: 1) 标准模式下的iPhone 6/6plus 3x 条目的 1242x2208 图像 2x 条目的 750x1334 图像
2) 缩放模式下的 iPhone 6/6Plus 或 iPhone 5 3x 条目的 1125x2001 图像 2x 条目的 640x1136 图像 R4-2x 条目的 640x1136 图像
为了使其正常工作,然后我需要确定设备是否是新设备并且是否处于缩放模式。基于此信息,我从正确的图像集加载图像。
这是我用来确定设备是否是新设备以及缩放/标准模式的代码:
UIScreen *screen = [UIScreen mainScreen];
if (screen.scale == 3 && screen.currentMode.size.width == 1242 ||
    screen.scale == 2 && screen.currentMode.size.width == 750) {
    self.overlay = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"StdImageSet"]];
} else {
    self.overlay = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"ZoomedImageSet"]];
}

这很糟糕,我讨厌做这个,因为图像集应该消除这种代码。我还没有看到更好的解决方法,并已提交了一个雷达 (radar 18463463) 错误报告。


1
谢谢这个。我一直在拼命地理解为什么在缩放模式下 6+ 会加载全尺寸的图片。 - Malakim
谢谢你。这真的很令人沮丧。让我担心的是,虽然Xcode已经更新了iWatch,但没有迹象表明这个错误被修复了。这一定是一个错误,对吧...?我会报告这个问题,希望他们能解决这个问题。 - pingin

5

这里列出了我对iPhone设备的一些观察结果(或许对某些人有所帮助):

  1. iPhone 4S - 2x Any/Any 瓷砖
  2. iPhone 5 - 2x 1GB/Any 瓷砖
  3. iPhone 5S - 2x 1GB/Any 瓷砖
  4. iPhone 6 - 2x 1GB/Any 瓷砖
  5. iPhone 6 Plus - 3x 1GB/Any 瓷砖

为了实现这个,我检查了设备 - iPhone,内存为1GB。正如你所看到的,对于 iPhone 5/5S/6 的图形之间没有区别。也许调整 Metal 1v2/2v2 的设置可能会有所区别,但在我看来这似乎太疯狂了。知识参考从10:50开始

从WWDC的内容中得知,现在我们应该考虑大小类别而不是分辨率/设备/设备方向的特定情况(除了iPhone 6 Plus的大小类别相同),但如果任何人仍然出于某种原因需要特定设备的图形并想要使用资源目录(这很棒),那么你可以得到我目前发现的可用内容(Xcode 7)。


3
同意你的看法,无法区分iPhone 5/5S/6的确很奇怪。 - hash3r

5

2
是的,那是一个有用的解释如何使用6+比例尺。然而,我认为这并没有回答我的问题。经过实验,我发现在Xcode 6.0.1中,iPhone 6图像应该放入@2x中。我认为这是一个错误,因为现在没有地方放置@2x图像,这些图像是为iPhone 4s(仍然支持iOS8)而设计的。此外,在图像集中没有地方放置iPhone 6和6+的显示缩放模式的图像。 - Kurt Schwartz
2
@KurtSchwartz,我承认自己错了。在发布评论后,我进行了双重检查,iPhone 6确实使用了针对iPhone 4s的2x图像,而不是来自retina 4 2x的图像。PaintCode链接似乎有误,看起来像是一个小错误。然而,这并没有太大的区别——无论如何,该图像都被iPhone 6(放大)和另一个型号共享。 - Anthony Scott
1
我已经在这个问题上提交了一个雷达报告。除了缺少640x960 2x图像的drop-well之外,我认为为了在iPhone 6+的缩放显示模式下获得像素精确的图像,Xcode图像集需要一个额外的1125x2001 3x图像的drop-well。对于6上的缩放模式图像,我认为当设备处于此模式时,应自动加载视网膜-4 2x图像。我怀疑实际上加载的是2x图像,但我没有6,所以无法测试。 - Kurt Schwartz
3
我认为PaintCode的链接正确,但iPhone 6上的UIImage加载机制存在问题。我刚刚尝试了一下,iPhone 6确实忽略了“Retina 4”的资源版本。 - Tricertops
1
哦,好眼力。它使用4/4S图像大小真是太疯狂了,这一定是个bug。 - Stephen Darlington
显示剩余3条评论

5
这真的很烦人。对于设备特定设置,我们都希望有类似于LaunchImage Set的菜单,不同屏幕尺寸使用不同的占位符。

1

我刚找到了一个新的解决方案。使用retina 4图像来代替2x,并将全屏图像视图的内容模式设置为比例填充,可以在iPhone 4s和iPhone 6上都正常工作。


4
那不是一个好的解决方案,因为它会把图片剪裁掉一部分。 - Ali

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