拥有@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 资源的主要内容,如果未能解决你的问题,请参考以下文章