2014-02-17 31 views
0

我創建了適用於iPad的應用程序,所以我有兩個不同版本的圖像,例如:iOS版:管理一個通用的應用程序

image.png (for iPad 2 or iPad Mini-not retina) 
[email protected] (for iPad >= 3 and iPad mini-retina) 

這是很容易的。

現在我應該創建一個通用版本的我的應用程序,所以我創建了我的新啓動圖像,圖標和一些背景的iPhone尺寸沒有@ 2x,因爲我不想考慮iphone 3gs,所以我沒有設置用@ 2x的iphone圖像。 一切都好。

但我的應用程序是一款遊戲,所以我有很多圖片也適合我的iphone版本。問題是iPhone 4,4s,5和5s使用@ 2x拍攝圖像,但對於這些設備,尤其是iPhone 4,這些圖像非常大,而且我有一些內存泄漏與崩潰。 現在,我的問題是:有沒有辦法,如果設備是視網膜,拍攝沒有「@ 2x」的圖像?

+0

那麼我的第一個建議是修復內存泄漏。您還可以爲iphone專門添加圖片:'image @ 2x〜iphone.png'。 – rckoenes

+0

我不想添加圖片,因爲我的應用程序如此之大 – CrazyDev

回答

0

當然,只管理自己打開圖像。例如,我想要像「imageNamed」這樣的方法,但不希望imageNamed所做的緩存,所以我寫了自己的。這不是你想要的功能,但它說明了這個概念,你可以制定自己的規則。執行自己的實現並不是一項巨大的工作。如果你想想要 imageNamed的緩存,只需使用imageNamed打開你最終決定使用的圖像。

// An "uncached" version of -imageNamed. 
// It looks for the scale-and-idiom suffixes @2x, ~ipad, and @2x~ipad 
// and preferentially loads the specific version if it is available. 
+ (UIImage *)imageNamedUncached:(NSString *)name { 
    NSString *tryName; 
    NSString *nonRetinaiPadTryName = @""; 
    NSArray *parts = [name componentsSeparatedByString:@"."]; 
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { 
     if ([[UIScreen mainScreen] scale] == 1.0) { 
      // non-retina 
      tryName = [parts[0] stringByAppendingString:@"~ipad"]; 
      tryName = [tryName stringByAppendingString:@"."]; 
      tryName = [tryName stringByAppendingString:parts[1]]; 
     } else { 
      // retina 
      tryName = [parts[0] stringByAppendingString:@"@2x~ipad"]; 
      tryName = [tryName stringByAppendingString:@"."]; 
      tryName = [tryName stringByAppendingString:parts[1]]; 
      nonRetinaiPadTryName = [parts[0] stringByAppendingString:@"~ipad"]; 
      nonRetinaiPadTryName = [nonRetinaiPadTryName stringByAppendingString:@"."]; 
      nonRetinaiPadTryName = [nonRetinaiPadTryName stringByAppendingString:parts[1]]; 
     } 
    } else { 
     // iPhone 
     if ([[UIScreen mainScreen] scale] == 1.0) { 
      // non-retina 
      tryName = name; 
     } else { 
      // retina 
      tryName = [parts[0] stringByAppendingString:@"@2x"]; 
      tryName = [tryName stringByAppendingString:@"."]; 
      tryName = [tryName stringByAppendingString:parts[1]];  } 
    } 
    NSString *path = [[NSBundle mainBundle] pathForResource:tryName ofType:nil]; 
    //NSLog(@"For tryName %@ I get path %@",tryName, path); 
    if (! path) { 
     // If this is a retina iPad we made a non-retina try name -- so check that 
     if (! [nonRetinaiPadTryName isEqualToString: @""]) { 
      path = [[NSBundle mainBundle] pathForResource:nonRetinaiPadTryName ofType:nil]; 
      //NSLog(@"For non-retina ipad try name %@ I get path %@",nonRetinaiPadTryName, path); 
     } 
     if (! path) { 
     // Try the unmodified name 
     path = [[NSBundle mainBundle] pathForResource:name ofType:nil]; 
      //NSLog(@"For base name %@ I get path %@",name, path); 
     } 
    } 
    UIImage *pathImage = [UIImage imageWithContentsOfFile:path]; 
    return pathImage; 
} 
+0

哇,謝謝!我明白了,我可以修改這個方法來解決我的問題,非常感謝 – CrazyDev