1. 程式人生 > >關於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