3

我有一个继承的项目,其中包含一堆使用的代码-[UIImage imageWithContentsOfFile:]和完整的路径。我将它转换为使用-[UIImage imageNamed:]和只是文件名(无扩展名),所以我可以传递它,比如@"icon"并获得icon.pngor icon@2x.pngor icon~ipad.png,视情况而定。

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

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

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

我宁愿重新实现整个“如果视网膜,附加@2x,等等......”的事情,因为那是(a)麻烦和(b)脆弱(如果Apple改变/增强行为怎么办?)

提示?

谢谢!

4

3 回答 3

0

对于像素的使用sizescale属性:

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

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

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

这是UIImage 文档

于 2012-07-11T22:02:14.250 回答
-1

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

但是,您可以通过使用此处的优势来定义自己的捆绑包,[NSBundle bundleWithPath: @"subfolder"]然后您可以使用捆绑包方法来检索优化的资产。

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

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

虽然这个问题没有答案,但它很好地总结了我的经验。 NSBundle pathForResource:ofType: 和 UIImage imageWithContentsOfFile: 如何处理比例和设备修饰符?

于 2012-07-11T22:32:22.267 回答
-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);
}

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

于 2012-07-11T22:06:16.920 回答