拥有@2x 图像资源而没有@1x 资源

Posted

技术标签:

【中文标题】拥有@2x 图像资源而没有@1x 资源【英文标题】:Having @2x image assets without @1x assets 【发布时间】:2015-11-02 15:49:52 【问题描述】:

我正在开发一个包含大量图形的应用程序。该应用程序的目标是运行 ios 7+ 的 iPhone,因此所有支持它的设备都有视网膜显示器。我只添加了@2x 和@3x 图形,因为@1x 图形永远不会被使用,而且我不希望捆绑包的大小超过它必须的增长。

我以编程方式加载大部分图像:

[self.imageView setImage:[UIImage imageNamed:@"ButtonOn"]];

这应该为@2x 显示器加载ButtonOn@2x.jpg,为iPhone 6 plus 加载ButtonOn@3x.jpg

但是,我注意到了这种行为:

iPhone 6 Plus 确实加载了@3x 图像。 但其他 iPhone(4、4s、5s 和 6)不加载 @2x。 我可以通过图形全名强制它加载@2x图像,例如:[UIImage imageNamed:@"ButtonOn@2x.jpg"],但这违背了命名约定的目的,它也迫使我自己检测屏幕密度。

有没有办法让@2x 和@3x 图像没有@1x 图像?

更新:问题与屏幕密度无关。问题是,因为我使用的是 JPG 图形而不是 PNG 图形,所以 Xcode 找不到它们,除非我使用文件的全名扩展名。也许这是一个错误。

【问题讨论】:

当您的应用在 iPad 2 上运行时,您需要 1x 图像。 错误在于不听你被告知的内容...... 我在听,但我也在使用资产目录。 拥有一个资产目录,但这并不意味着您正在使用它。如果您在 imageNamed: 中指定的名称与资产目录中设置的任何图像的名称都不匹配,则运行时会改为进入应用程序包。这就是它一直在做的事情。 【参考方案1】:

省略 1x 图像并没有错,而且对于仅限 iPhone 的应用程序确实通常这样做(因为没有可运行此系统的单分辨率 iPhone 设备)。问题是你的代码。特别是这一行是错误的:

[self.imageView setImage:[UIImage imageNamed:@"ButtonOn"]];

你有两个选择:

这是一个 .jpg 文件,所以这样说:

[self.imageView setImage:[UIImage imageNamed:@"ButtonOn.jpg"]];

更好的是,保持原样,使用资产目录而不是具有有趣的 @2x 名称的单个文件。

编辑:根据您的 cmets 和您问题中的详细信息,我不得不说您对是否使用资产目录深感困惑。你说你是,但在这种情况下,说[UIImage imageNamed:@"ButtonOn@2x.jpg"] 是行不通的——你说它确实有效。所以很明显,你仍然有这个文件位于你的应用程序包的顶层。这是你问题的一部分。您需要从应用程序包中删除这些图像文件并依赖资产目录。

【讨论】:

我正在使用资产目录。除非我还添加 1x 图像,否则不会加载 2x 图像。 “除非我还添加 1x 图像,否则不会加载 2x 图像”这不是真的。我一直这样做。如果您使用的是资产目录,那么名称 @"ButtonOn@2x.jpg" 根本不应该工作。我不得不建议您认为您正在使用资产目录,但也许您没有。显然,您仍然在应用程序包中命名了图像文件。您需要删除这些。我已经修改了我的答案以提及这一点。 我发誓我只使用资产目录 =P。我保留了命名约定,因为如果您使用命名约定将图像拖到资产目录中,Xcode 会自动将它们放在正确的屏幕密度中。我注意到问题不是我描述的问题。真正的问题是,除非我添加 .jpg 扩展名,否则图像不会加载......我不知道这是否与它们不是 PNG 的事实有关。 "真正的问题是除非我添加 .jpg 扩展名,否则图像不会加载" 那么要么您没有使用资产目录,要么您给图像集提供了错误的名称。相信我。 命名是正确的,它是一个资产目录......但我只是想通了。我尝试使用 PNG 文件而不是 JPG 文件,它工作正常。显然,当您使用 JPG 文件时,您必须包含文件的扩展名:[UIImage imageNamed:@"ButtonOn.jpg"],否则将找不到它。

以上是关于拥有@2x 图像资源而没有@1x 资源的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 中使用图像资源

是否需要添加 @2x 或 @1x 图像

UIImageView 根据方向使用不同的图像

关于 Android 图像和资产大小

使用 Sketch 3 的 iOS 图像分辨率大小

iOS App Thinning - 如何根据屏幕尺寸实现它?