最近再寫一個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