2012-07-11 152 views
2

我有一堆使用-[UIImage imageWithContentsOfFile:]和完整路径的代码的继承项目。我正在将其转换为使用-[UIImage imageNamed:],只是文件名(无扩展名),所以我可以将它传递给@"icon",并根据情况获得icon.png[email protected]icon~ipad.png如何确定 - [UIImage imageNamed:]将加载的文件的路径?

问题是,在程序中有一部分我想检查图像的大小,如果它太大,我想显示,而不是TooBigImage.png

所以我需要知道,如果我打电话给[UIImage imageNamed: someName],它将使用哪个扩展名/修饰名。基本上,我需要该文件的路径,所以我可以在加载图像之前检查它的大小。或者,如果有方法检查imageSizeForImageNamed:或类似的东西,我可以使用它,我只是不知道任何。 (a)笨重和(b)脆弱(如果苹果改变/增强了这个功能,如果苹果改变了/增加了这个功能,行为?)

提示?

谢谢!

+0

当你说大小,你的意思是像素尺寸或以字节为单位的大小? – idz 2012-07-11 21:40:03

+0

我不想踩脚趾,但是[UIImage imageNamed]'只能用于UI图标图像,因为它将检索到的图像缓存在RAM中,这可能会导致内存问题(如果使用错误)。另一方面,'[UIImage imageWithContentsOfFile]'不会进行缓存,这对于较大的图像是可取的。 – 2012-07-11 22:08:59

+0

@ids:要么。 @Torsten:我相信你误解了不使用'imageNamed'。系统缓存很好,早期iOSs的泄漏早已修复。 – Olie 2012-07-12 01:02:09

回答

0

对于像素使用sizescale属性:

UIImage *getMySize = [UIImage imageNamed:@"blah"]; 

float width = getMySize.scale * getMySize.size.width; 

float height = getMySize.scale * getMySize.size.height; 

这里是UIImage Documentation

+0

对。我想知道是否有一个解决方案给了我''imageNamed:'将要使用的文件的名称,所以我可以检查它的文件统计信息而不加载它。 – Olie 2012-07-12 01:05:58

+0

那么,一旦你有像素大小,你应该能够确定它正在返回哪个文件,除非你有多个文件名称“blah * .png”,它们在你的主包中大小相同。当你对主包进行如此多的控制时,使用大小信息和回溯来找出它正在使用哪些文件应该不会太难。 – 2012-07-12 11:12:37

-1

据我所知,你应该实现自己的功能来手动检查文件的大小。

您可以生成自己的名字,如:

-(bool)fileOk:(NSString*)filename 
{ 
    bool retina = [UIScreen mainScreen].scale == 2.0; 
    static bool iPad = UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPad; 

    //Generate the filename 
    NSString *fullFilename = [NSString stringWithFormat:@"%@%@%@",filename,(retina)[email protected]"@2x":@"",(iPad)[email protected]"~ipad":@"~iphone"]; 

    //Get the size: 

    NSError *error; 
    NSString *fullPath=[[NSBundle mainBundle] pathForResource:fullFilename ofType:@"png"]; 
    NSDictionary *fileDictionary = [[NSFileManager defaultManager] attributesOfItemAtPath: fullPath error:&error]; 

    return (fileDictionary && [fileDictionary fileSize]<SOME_TO_BIG_SIZE_CONSTANT); 
} 

然后你可以选择,如果你要显示的图像或没有。我还没有尝试过的代码,所以可能会有一些错字...... 我希望,这是您要寻找的......

+0

这就是我在脆弱性问题中提到的问题。 (正如发布的那样,它也是bug,但我会把它作为一个练习;) – Olie 2012-07-12 01:12:44

+0

我编辑过,所以它检测文件是否存在。如果文件不存在,fileDictionary将为零。我认为你是一个非常容易解决的问题,因为它很容易徘徊...... – 2012-07-12 10:35:47

-1

[UIImage imageNamed: @"icon"]看起来总是在应用主束。因此icon.png必须位于要找到的包中。在那里不允许子路径。

但是,您可以使用[NSBundle bundleWithPath: @"subfolder"]定义您自己的捆绑软件,这里的优点是您可以使用捆绑方法来检索优化的资产。

NSBundle *bundle = [[NSBundle bundleWithPath: @"folder"] autorelease]; 

然后,[bundle pathForResource:ofType:]将您的文件夹返回正确的图像资源的路径(即图标〜新iPad)和[UIImage imageWithContentsOfFile:]将采取大小改性剂护理。

虽然这个问题没有答案,但它总结了我对这方面的经验。 How do NSBundle pathForResource:ofType: and UIImage imageWithContentsOfFile: handle scale and device modifiers?

+0

是的,'imageNamed'总是在主包中查找,但它并不总是加载“icon.png” - 这就是这个问题是关于:我可以确定将加载哪个文件? – Olie 2012-07-12 01:13:49

+0

它将加载最合适的资源。根据定义,该函数从包的根文件夹中加载具有给定名称的png图像。没有办法(我知道)也告诉这个函数加载另一个图像。该功能虽然足够聪明,可以加载iPhone/ipad和/或@ 2x图像(如果存在)。 – 2012-07-12 14:47:57