有什么办法迫使UIKit在某些设备上使用标准(不是@ 2x)图像,即使有@ 2x图像可用?

时间:2012-11-16 23:17:55

标签: iphone ios uikit retina-display ipod-touch

我正在开发一个使用大量详细图形的项目。由于随时显示的精灵,背景等数量,它具有大的内存占用。我们使用cocos2D作为动画和精灵,使用UIKit作为UI,菜单等。

如果设备是带有视网膜显示屏的iPod Touch,我希望能够通过强制UIKit使用标准分辨率图像来减少iPod Touch上的内存使用量(内存比同等iPhone更少)。我可以在cocos2d中设置一个标记SD图像的强制加载,但是我还没有为UIKit找到类似的选项或解决方法。

总而言之,该项目是一个通用二进制文件,包含SD和视网膜风格的所有图像,如下所示:

image.png

image@2x.png

在iPhone 4,4S和5(均带有视网膜显示屏)上,需要加载@ 2x版本图像的默认UIKit行为。

在iPod Touch第4代(可能是第5代)我想强制UIKit加载SD image.png文件,即使有image@2x.png文件也可用。

这是为了减少这些具有视网膜显示器的设备的内存占用量,但是这些设备的RAM是手机的一半。

如果有人有任何想法或解决方法来实现这一点,我真的很感激!

3 个答案:

答案 0 :(得分:2)

添加我的评论作为答案,

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

例如: -

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

并将testImageNamed方法实现为UIImage中的一个类别,该类别根据设备和视网膜/非视网膜分辨率返回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 :(得分:1)

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

希望它有所帮助!见到你!

答案 2 :(得分:-1)

我会在UIImage上用类似

的函数编写一个类别

myImageNamed:(的NSString *)名称

然后使用UIDevice确定当前设备并在您的包中搜索您要使用的图像。

它看起来像这样:

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

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

}