我有一个继承的项目,其中包含一堆使用-[UIImage imageWithContentsOfFile:]
和完整路径的代码。我正在将其转换为使用-[UIImage imageNamed:]
和文件名(无扩展名),因此我可以将其传递给@"icon"
,并获取icon.png
或icon@2x.png
或{{ 1}},视情况而定。
问题是,程序中有一部分我要检查图像的大小,如果它太大,我想显示icon~ipad.png
。
所以我需要知道,如果我调用TooBigImage.png
,它将使用哪个扩展/修改名称。基本上,我想要该文件的路径,所以我可以在加载图像之前检查它的大小。
或者,如果有办法检查[UIImage imageNamed: someName]
或类似的东西,我可以使用它,我只是不知道。
我宁愿不重新实施整个“如果是视网膜,追加@ 2x等......”的事情,因为那是(a)笨重而且(b)脆弱(如果Apple如果改变/增加行为?)
提示?
谢谢!
答案 0 :(得分:0)
对于像素使用size
和scale
属性:
UIImage *getMySize = [UIImage imageNamed:@"blah"];
float width = getMySize.scale * getMySize.size.width;
float height = getMySize.scale * getMySize.size.height;
答案 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?