2013-02-04 53 views
0

我的應用程序具有較大的尺寸,因爲它具有通用性並專爲Retina顯示器設計。我希望允許用戶從我的服務器下載Retina圖像,而不是最初將它們包含在應用程序中。保存高分辨率資源,以便應用程序知道它可以在視網膜設備上使用它們

我試着用下面的代碼。唯一的問題是,圖像存儲在文檔文件夾,應用程序將無法識別它們的視網膜圖像

UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.test.com/[email protected]"]]]; 
NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
NSString *pngFilePath = [NSString stringWithFormat:@"%@/[email protected]",docDir]; 
NSData *data1 = [NSData dataWithData:UIImagePNGRepresentation(image)]; 
[data1 writeToFile:pngFilePath atomically:YES]; 

我應該如何保存圖像,讓應用程式使用它們?

回答

1

imageWithData:方法將始終創建一個規模爲1.0(非視網膜)的圖像。從創建一個自定義位置視網膜感知的UIImage管束之外,您需要使用initWithCGImage:scale:orientation:方法:

UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.test.com/[email protected]"]]]; 
UIImage *retinaImage = [UIImage initWithCGImage:[image CGImage] scale:2.0 orientation:UIImageOrientationUp]; 

(顯然,你應該下載的圖像同步...)。

我需要做同樣的事情(從文件目錄加載比例相關圖片)在我的最後一個項目,所以我寫了一首歌一個UIImage類小便利方法:

- (id)initWithContentsOfResolutionIndependentFile:(NSString *)path 
{ 
    if([[UIScreen mainScreen] scale] == 2.0) { 
     NSString *path2x = [[path stringByDeletingLastPathComponent] 
          stringByAppendingPathComponent:[NSString stringWithFormat:@"%@@2x.%@", 
                  [[path lastPathComponent] stringByDeletingPathExtension], 
                  [path pathExtension]]]; 

     if([[NSFileManager defaultManager] fileExistsAtPath:path2x]) { 
      return [self initWithCGImage:[[UIImage imageWithData:[NSData dataWithContentsOfFile:path2x]] CGImage] scale:2.0 orientation:UIImageOrientationUp]; 
     } 
    } 

    return [self initWithContentsOfFile:path]; 
} 

用法:

UIImage *myImage = [[UIImage alloc] initWithContentsOfResolutionIndependentFile:@"/path/to/image.png"]; 

這將嘗試從/path/to/[email protected]當加載在視網膜上成像,並使用/path/to/image.png否則。

1

它不工作,因爲UI圖像的來源是Bundle而非NSDocumentDirectory文件夾。要使用視網膜和非視網膜圖像,您應該檢測設備是否爲視網膜,並從NSDocumentDirectory以編程方式加載圖像。

您可以使用this進行視網膜檢測。

+0

以及如何加載圖像形成NSDocumentDirectory? – aLFaRSi

+0

感謝您的幫助 – aLFaRSi

+0

使用你的代碼,添加'UIImage * image = [UIImage imageWithContentsOfFile:pngFilePath];',其中pngFilePath是圖像路徑。 – djserva

0

您可以使用[UIImage imageWithData: scale:]並能夠跳過「@ 2X」命名約定:

- (UIImage *)getRetinaSafeImage: (NSString *)fileName 
{ 
    // alternatively you can use NSURL instead of path 
    NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
    NSData *myImageData = [NSData dataWithContentsOfFile: [NSString stringWithFormat:@"%@/%@",docDir, fileName]]; 

    if([[UIScreen mainScreen] scale] == 2.0) 
     return [UIImage imageWithData:myImageData scale:2.0]; 
    else return [UIImage imageWithData:myImageData]; 
} 
相關問題