以编程方式加载Retina(高清)图像(在按钮上)

5
我有一个问题一直没有解决。我已经制作了一个应用程序,可以从前置和后置摄像头拍照然后将它们合并在一起。
应用程序的名称是GroupCam。
然而,我的UIButtons无法在一开始就加载成视网膜图像。如果我在接口构建器中将它们设置为@2x,则它们看起来很清晰,但一旦我编程重新加载它们,低版本将出现。
这是因为,在拍照后屏幕更改时,按钮图像会更改,但当用户按下返回按钮时,相机图标将看起来很糟糕(因为正在加载低质量版本)。
请查看以下图片:
第一屏:只有右上角的按钮出现扭曲,因为我正在检查闪光灯的值并“编程”加载相应的图像。
第二屏:用户移动到另一个屏幕并回到第一个屏幕,所有按钮都被重新加载,它们现在都看起来扭曲。
为什么会发生这种情况?
编辑:
这是我如何加载图像的方式。
[self.flashButton setImage:[UIImage imageNamed:@"flashOff"] 
                          forState:UIControlStateNormal];

我在互联网上看到过这样的说法,这样做会自动加载最适合的图像版本。

我也尝试了这个方法,但结果是一样的:

[self.takeButton setImage:[UIImage imageNamed:@"takePhoto.png"] forState:UIControlStateNormal];

1
我在应用程序中使用普通和视网膜图像取得了很好的效果。所以我建议您选择这些图像的正常分辨率,并不将它们包含在您的项目中(通过第三个最右边的窗格 - 只需取消选中复选框)。现在,您的应用程序仅拥有视网膜图像。嗯,如果出现问题,那么您的应用程序中可能出了问题。[UIImage imageNamed:foo.png]存在一些问题。如果您更改该图像,则所有后续使用该图像的用户都会获取修改后的图像。重新阅读UIImage imageNamed:。 - David H
2
所以我刚刚重新阅读了你的问题,并看到了这个声明:“如果我在界面构建器中将它们设置为“@2x”。”因此,在IB中,您已将它们的名称输入为“takePhoto@2x.png”,并且可以正常工作。因此,我能想到的唯一问题可能是“@2x”的格式。您确定已正确命名这些图像-“name@2x.png”,而不是&2x.png等。似乎iOS无法看到高分辨率文件,这是我能想到的唯一原因。因此,请尝试在IB中删除“@2x”,然后查看会发生什么。我敢打赌,您将始终获得所有低分辨率。 - David H
是的,它们的格式和命名都正确。这些图像单独加载时将以高清晰度完美显示,唯一的问题是当我以编程方式加载它们时,iOS会决定加载低清晰度版本。 - Pochi
你使用的名称与上例中一样,没有加上“iPhone”或“iPad”的后缀吗?我再次查看了资源编程指南以获取灵感。唯一能看到的是,部署目标必须是iOS 4或更新版本。如果这种情况发生在我身上,我会创建一个新的测试项目,并使用imageNamed将图像添加到单个视图中,只是为了查看是我的系统还是我的应用程序的问题。你的设备可能有一些内部损坏导致出现这种情况。在我的设备上,@2x正常工作。 - David H
2
你能否将按钮图像文件(两个分辨率)和文件名附加到你的问题中? - jrturton
在终端上执行ls命令,列出所有图像文件,并将其添加到您的问题中。RAZ提到的大小写问题可能是问题所在。此外,其他人刚刚报告了相同的问题:http://stackoverflow.com/q/11665407/96716 - David H
3个回答

4
首先,很有必要确认低分辨率版本是否真正显示。最近我曾做出类似的假设,并更换了图像的低分辨率版本,确认高分辨率版本实际上仍在显示,但是被扭曲了。
我的实际问题是,我已经设置了 .layer.shouldRasterize = YES;
如果任何一个按钮的祖先都设置了这个选项,那么它很可能是你的问题。

3

在模拟器中,图像文件名的大小写不重要,但在设备上很重要。

请使用一致的大小写。Image.png和image@2x.png会被识别并在模拟器中一起工作,但在设备上不行。请使用image.png和image@2x.png。或者您也可以使用.jpg格式,只要大小写匹配即可。


3
如果您的应用程序需要从前置摄像头和后置摄像头拍摄照片并将它们合并在一起,那么设备必须有一个前置摄像头。所有具有前置摄像头的iOS设备也都有视网膜显示屏(只要您不是为iPad 2开发,但那是另一回事),因此您实际上根本不需要使用普通图像,所以所有图像都应该是视网膜图像。如果没有普通图像,则这个问题根本不会发生。备份一份副本,尝试删除所有普通图像,然后再试一遍。因为您正在使用UIImage imageNamed:“ImageName”,就像您说的那样,应该会自动选择图像!祝你好运!

我有点希望找到这种情况发生的原因,但这似乎是一个解决方案。 - Pochi
@LuisOscar 抱歉,那是我最好的猜测 :( 请尝试在bugreport.apple.com上报告错误。 - sridvijay

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