有没有办法强制UIKit在某些设备上使用标准(而不是@2x)图像,即使@2x图像可用?

3

我正在开发一个使用大量详细图形的项目。由于所有精灵、背景等都在同一时间显示,因此它的内存占用很大。我们使用cocos2D进行动画和精灵操作,使用UIKit进行UI、菜单等操作。

如果设备是带视网膜显示器的iPod Touch,则我想通过强制UIKit使用标准分辨率图像来减少内存使用。我能够在cocos2d中设置一个标志以强制加载SD图像,但我还没有找到类似的选项或解决方法适用于UIKit。

因此,总结一下,该项目是一个通用二进制文件,其中所有图像都具有SD和视网膜版本,如下所示:

image.png

image@2x.png

在iPhone 4、4S和5(都带有视网膜显示器)上,期望默认UIKit行为加载@2x 版本的图像。

在第四代iPod Touch(可能还包括第五代)上,即使也有image@2x.png文件可用,我也希望强制UIKit加载SD image.png文件。

这是为了减少这些带有视网膜显示器但只有一半内存的设备的内存占用。

如果有人对实现这一目标有任何想法或解决方法,我会非常感激!


1
你可能需要创建自己的方法来根据设备获取图像。在这种情况下,你不应该使用@2x命名图像。你的方法应该根据设备和Retina显示器获取图像,并返回一个可以用于创建UIImage对象的图像名称。这个方法可以作为UIImage的一个类别添加。 - iDev
iPod 5的内存与iPhone 4和4s相同,均为512 MB。 iPod 4是您可能需要担心的唯一设备,它只有256 MB的内存。 如果您有足够的图像数据,因为256 MB的内存限制而感到担忧,您可能需要重新处理您的图像数据的方法。 - msgambel
3个回答

2

作为回答,我想补充一下:

你可能需要创建自己的方法来根据设备获取图片。在这种情况下,你不应该使用 @2x 命名图片。你的方法应该根据设备和视网膜显示器来获取图像,并返回可用于创建 UIImage 对象的图像名称。此方法可以添加到 UIImage 的类别中。

例如:

[UIImage testImageNamed:@"test.png"];

并在UIImage中实现testImageNamed方法,作为一个分类,根据设备和视网膜/非视网膜分辨率返回testRetina.pngtest.png

更新: 或者,您也可以尝试在此类别中为iPod touch设备使用以下内容,以便您可以保留带有@2x的图像(test.png和test@2x.png)。 我不确定这是否有效。 我假设如果fileName仅为“test”,则可能会获取test.png本身,但我尚未尝试过。 这绝对值得一试。

NSString *fileLocation = [[NSBundle mainBundle] pathForResource:fileName ofType:extension];
NSData *imageData = [NSData dataWithContentsOfFile:fileLocation];
[UIImage imageWithData:imageData];

只需在iPod touch上添加上述内容,对于其他设备,它可以返回正常的[self imageNamed:@"test.png"];

1

我认为最好的做法是在iPod上加载不同的图像,这样你就可以保证不存在@2x版本。这样可以节省RAM,但实际上由于图像重复,应用程序会更加沉重...

希望能帮到你!再见!


谢谢Ricard...你知道有什么方法可以做到这一点吗?我不知道是否有一种方法可以在App Store上编译一个版本的应用程序并将其针对iPod Touch,以及为iPhone编译的另一个版本的应用程序。你知道怎么做吗? - Daniel Hall
你可以像Rich86man提到的那样创建某种类别,检查当前设备是否为iPod,如果是,则尝试通过使用新字符串名称调用imageNamed:来获取带有后缀-iPod(或类似名称)的图像。如果该图像不存在或设备不是iPod,则只需使用原始名称调用imageNamed:即可。 - Ricard Pérez del Campo

-1

我会写一个关于 UIImage 的类别,其中包含一个名为 myImageNamed:(NSString*)name 的函数。

然后使用 UIDevice 确定当前设备并搜索您的捆绑包,以查找要使用的图像。

它看起来会像这样:

- (UIImage*)myImageNamed:(NSString*)name
{
    if (!notIpodTouch) {
       return [self imageNamed:name];
    }

    //search through mainBundle for file with passed in name
    //return that

}

感谢Rich86man。即使我按照您所描述的方式创建了一个类别,难道在某个时候我不得不使用内置的UIImage加载方法并使用我的标准res文件名,例如image.png吗?如果image@2x.png存在,UIImage不会自动获取它吗?棘手的问题是,我们需要使用image.png和image@2x.png命名方案来支持iPhone和早期iPod Touch上的标准视网膜处理。如果我采用上述类别方法,最终我需要为iPod Touch加载不同的文件名,是吗?这意味着包含冗余资产:( - Daniel Hall

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