如何确定 - [UIImage imageNamed:]将加载的文件的路径?

时间:2012-07-11 21:14:50

标签: ios uiimage

我有一个继承的项目,其中包含一堆使用-[UIImage imageWithContentsOfFile:]和完整路径的代码。我正在将其转换为使用-[UIImage imageNamed:]和文件名(无扩展名),因此我可以将其传递给@"icon",并获取icon.pngicon@2x.png或{{ 1}},视情况而定。

问题是,程序中有一部分我要检查图像的大小,如果它太大,我想显示icon~ipad.png

所以我需要知道,如果我调用TooBigImage.png,它将使用哪个扩展/修改名称。基本上,我想要该文件的路径,所以我可以在加载图像之前检查它的大小。

或者,如果有办法检查[UIImage imageNamed: someName]或类似的东西,我可以使用它,我只是不知道。

我宁愿重新实施整个“如果是视网膜,追加@ 2x等......”的事情,因为那是(a)笨重而且(b)脆弱(如果Apple如果改变/增加行为?)

提示?

谢谢!

3 个答案:

答案 0 :(得分:0)

对于像素使用sizescale属性:

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

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

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

这是UIImage Documentation

答案 1 :(得分:-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)?@"@2x":@"",(iPad)?@"~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);
}

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

答案 2 :(得分:-1)

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

但是,您可以使用[NSBundle bundleWithPath: @"subfolder"]定义自己的捆绑包,这样做的好处是您可以使用捆绑方法来检索优化资产。

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

然后,[bundle pathForResource:ofType:]将从您的文件夹(即icon~ipad)返回正确的图像资源路径,[UIImage imageWithContentsOfFile:]将处理尺寸修改器。

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