在代码中指定图像时,不使用 Retina 图标 (@2x)

Posted

技术标签:

【中文标题】在代码中指定图像时,不使用 Retina 图标 (@2x)【英文标题】:Retina icons (@2x) aren't being used when images are specified in code 【发布时间】:2010-08-09 16:47:43 【问题描述】:

我在我的视图上放置了一个 play.png 图像。当视图最初加载时,iPhone 4 会抓取相应的 play@2x.png 文件,它看起来很棒。但是,当我点击播放按钮时,我的代码会将其换成 pause.png 文件。然后,当我点击 pause.png 以恢复 play.png 时,它使用原始 play.png 文件(不是我认为它会自动引用的 @2x 版本)。

这是我尝试使用的代码:

[button setImage:[UIImage imageNamed:@"play.png"] forState:UIControlStateNormal];

那么,如果我在初始视图加载后交换文件,我是否必须在 IF 语句中手动指定 @2x 版本?如果是这样,UIScreen.scale 是用于此的最佳属性吗?

我目前正在使用这样的代码:

if ([UIScreen mainScreen].scale > 1.0) 
 
    [button setImage:[UIImage imageNamed:@"play@2x.png"] forState:UIControlStateNormal]; 
 
else 
 
    [button setImage:[UIImage imageNamed:@"play.png"] forState:UIControlStateNormal]; 

它工作正常,但是里面有 IF 语句很烦人,而且看起来有点脆弱。

在此先感谢你们所有的聪明人。

【问题讨论】:

请发布您如何交换图像...UIImage imageNamed 通常会自动处理它,而其他方法还没有(目前) [按钮 setImage:[UIImage imageNamed:@"play.png"] forState:UIControlStateNormal]; 现在我正在使用以下内容(对不起,我不知道如何将代码格式化为代码): if ([UIScreen mainScreen].scale > 1.0) [button setImage: [UIImage imageNamed:@"play@2x.png"] forState:UIControlStateNormal]; else [button setImage:[UIImage imageNamed:@"play.png"] forState:UIControlStateNormal];它工作正常,但其中有 IF 语句很烦人,而且看起来有点脆弱。 @nicjohnson - 我在问题中插入了来自您的 cmets 的代码。希望我正确地传达了您的意思。将来,您应该能够编辑问题以插入这样的代码,然后使用文本上方编辑工具栏中的代码选项对其进行格式化(或在每行代码前使用四个空格)。 谢谢,布拉德。因此,据您所知,即使我在 play.png 和 pause.png 之间来回切换,imageName 也应该能够引用 play.png 并自动交换 @2x 版本? 【参考方案1】:

条件语句是不必要的。以下行就足够了:

[button setImage:[UIImage imageNamed:@"play.png"] forState:UIControlStateNormal];

ios 4.0 中,如果设备是 iPhone 4 并且具有视网膜显示屏,则 imageNamed: 方法会自动查找“@2x”文件名后缀。在以前版本的 iPhone OS 中,imageNamed: 方法只查找您编写的内容(即较低分辨率的图像)。之所以可行,是因为 iPhone 4 的操作系统版本不能低于 4.0,因此您的 Retina 显示器用户将始终拥有更高分辨率的艺术品。

【讨论】:

您会从我最初的帖子中注意到,您给我的代码行正是我使用的。它最初加载了播放图标的视网膜版本,但是当我点击它并将其与 pause.png 交换然后回到 play.png 时,它将使用低分辨率版本的 play.png。 不幸的是,您描述的代码应该可以正常工作,所以我认为问题出在您项目的其他地方。我刚刚制作了一个带有两个图像的按钮,每次单击它都会切换;工作正常。你能发布所有涉及这个按钮的代码吗?【参考方案2】:

你可以只使用:

[UIImage imageNamed:@"play"]

没有扩展名。这将加载 @2x 版本(如果可用并且设备具有 x2 比例)​​。

这适用于 iOS4 或更高版本。但是,如果您想在以前的版本中运行您的应用程序,您可以执行以下操作:

UIImage* image = [UIImage imageNamed:@"play"]; // for iOS 4 or greater
if(!image)
    image = [UIImage imageNamed:@"play.png"]; // for previous iOS versions

这样做的好处是,如果您在任何时候拥有@3x 或任何其他版本(如果 Apple 创建新设备或显示器),这将起作用。

您可以创建一个实用方法来避免在需要加载图像的任何地方执行此操作。

参见:Supporting High-Resolution Screens,“将图像加载到您的应用程序”部分

【讨论】:

好远见! IE。 iPhone 6 Plus 和@3x :)【参考方案3】:

两个可导致此问题的愚蠢错误(我之前都犯过):

    不小心将小号命名为 @2x 版本而不是大版本 那些 拥有大版本 稍微错开(一个像素)

【讨论】:

【参考方案4】:

我遇到了同样的问题,然后意识到我的 Windows Photoshop 导出的 .png 文件是 .PNG 文件。显然大小写确实很重要。

另见Hi-Res @2x image not being picked up for tab bar item

【讨论】:

【参考方案5】:

我可以确认这是 4.0 设备的问题。问题不在于它不加载 @2x 图像,它确实加载了,但仍以 72 DPI 显示它(导致它模糊)。

幸运的是这个错误在 4.1 中得到修复(在模拟器中测试)。

【讨论】:

【参考方案6】:

另一个帖子上的某个人提到,他们通过删除高分辨率图像并将其重新添加到项目中来设法解决了一个类似的棘手问题。

【讨论】:

【参考方案7】:

由于文件名,我遇到了类似的问题 - button_slice9.png 和 button_slice9@2x.png 不起作用。

但是 button_slice.png 和 button_slice@2x.png 在 imageNamed: 中按预期工作。

【讨论】:

【参考方案8】:

我刚刚遇到了一个类似的问题,需要一段时间才能弄清楚。事实证明,我的 @2x 图像不知何故没有添加到我的应用目标中,因此它们没有被打包。

【讨论】:

【参考方案9】:

当我用高分辨率 icon-close@2x.png 替换低分辨率 icon-close.png 时,我遇到了类似的问题。 iPad 构建似乎忽略了“@2x”并以双倍尺寸加载图像,比例 = 1.0。删除文件并重新添加没有帮助。将其重命名为“icon-leave@2x.png”。一些关于 icon-close.png 的错误信息缓存在某处

【讨论】:

以上是关于在代码中指定图像时,不使用 Retina 图标 (@2x)的主要内容,如果未能解决你的问题,请参考以下文章

从使用 jQuery 的代码中指定的元素中选择具有给定类的下一个元素

使用 Python 旋转具有 EXIF 中指定方向的图像,而不使用 PIL,包括缩略图

UIButton自定义视网膜图像在iPad Retina Display中伸展

使用 cloudformation 在 AWS ECR 中指定标签不变性

在 iPad Retina Display 中拉伸的 UIButton 自定义视网膜图像

如何在 HTML5 缓存清单中指定通配符以加载目录中的所有图像?