你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> 關於IOS中使用一倍圖與二倍圖的路徑用法

關於IOS中使用一倍圖與二倍圖的路徑用法

編輯:IOS開發綜合

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

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved