最近再写一个IOS换肤的应用,里面用到了动态加载图片的地方,这种场景一般分为两种,一种为APP内置资源(APP包内), 另一种为下载资源(Documents下),这时我们会遇到一个问题, 就是传入的参数都是xxxx.png 全都不带@2x的后缀, 然尔如果我按之前的常用的方法, 即:UIImage imageNamed:这个方法时, 我们不需要关心当前的屏幕分辨率是否为高分屏, 这个函数会帮我们实现不同的屏幕对应查找不同的图片,如果我们自己实现这个问题是否需要考虑, 答案只要用对方法是不需要处理的。
下面这个方法会帮我们处理我们想要的解决的问题:
image = [UIImage imageWithContentsOfFile:strPath];
大概实现方式如下:
NSMutableArray *reps = [NSMutableArray arrayWithCapacity:2];
CGImageSourceRef src1X = CreateCGImageSourceWithFile(imagePath);
CGImageSourceRef src2X = CreateCGImageSourceWithFile([[[imagePath stringByDeletingPathExtension] stringByAppendingString:@"@2x"] stringByAppendingPathExtension:[imagePath pathExtension]]);
if (src1X) {
UIImageRep *rep = [[UIImageRep alloc] initWithCGImageSource:src1X imageIndex:0 scale:1];
if (rep) [reps addObject:rep];
[rep release];
CFRelease(src1X);
}
if (src2X) {
UIImageRep *rep = [[UIImageRep alloc] initWithCGImageSource:src2X imageIndex:0 scale:2];
if (rep) [reps addObject:rep];
[rep release];
CFRelease(src2X);
}
return ([reps count] > 0)? reps : nil;
然而如果我们实现的方式转一下的话, 比如我们用NSData来实现图片加载,也是可以的。
NSData *imageData = [NSData dataWithContentsOfFile:imageFullPath];
image = [UIImage imageWithData:imageData];
但此时, NSData不会对我们的图片路径做任何特殊的处理, 如果你传入的路径是不带@2x的话, 那么就只能返回单倍的图。
因此用这种方式你需要自己来实现一下@2x是否需要的判断。
关于图片加载路径这样就可以完全解决了, 与imageNamed相比,只差一个缓存的问题, 重复图片多次访问可以感觉到差异的存在,这个也很好解决, 我自己用NSCache也实现了一下他的缓存, NSCache还会在内存不足时自动帮我们做释放的操作,每次取图片时先取一下缓存, 没有再读文件, 大功告成, 很简单。
//获取图片从缓存
-(UIImage*)getCacheImageByPath:(NSString*)path
{
if(_cache == nil){
_cache = [[NSCache alloc] init];
return nil;
}
UIImage *image = (UIImage*)[_cache objectForKey:path];
return image;
}
这不是教学, 只是我个人笔记, 哪里觉得处理的不好, 欢迎你给更好的解决方式。
QQ407300101