2012-10-04 63 views
12

比方說,我有一個包或資產目錄三幅影像:的UIImage imageNamed:不會自動地挑選視網膜@ 2X圖像

  1. 默認〜iphone.png
  2. [email protected]~iphone.png
  3. [email protected]

在iOS 4和以後,UIImage的構造可以採取的圖像名稱如下:

[UIImage imageNamed:@"Default"]; 

當我在3.5英寸的視網膜顯示屏(iphone)上時,它會自動選擇圖像(2)。如果在非視網膜顯示器上選擇(1)。這很棒。

我爲4英寸視網膜(iPhone 5)啓動圖像指定了圖像3。有沒有一種方法來命名圖像(3),以便當我在4英寸的視網膜顯示屏上運行時,它會使用相同的UIImage構造函數返回?

也許這還沒有實現,或者我期望從方便中得到太多......我只是想避免我的代碼中的任何條件邏輯根據屏幕尺寸選擇圖像。

回答

12

我也有同樣的問題,事實證明,沒有這樣的行爲iPhone 5/iPod Touch第5代。

您必須手動確定您的應用程序是否在此類設備上運行,並相應地更改文件名。

我用這個方法來檢查,如果我的應用程序在iPhone上運行5/iPod Touch的第五代:

#define IS_PHONEPOD5() ([UIScreen mainScreen].bounds.size.height == 568.0f && [UIScreen mainScreen].scale == 2.f && UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) 

然後你就可以調整圖像的名字是這樣的:

if(IS_PHONEPOD5()) { 
    myImageView.image = [UIImage imageNamed:@"MyImage-568h.png"]; 
} else { 
    myImageView.image = [UIImage imageNamed:@"MyImage.png"]; 
} 

更新
我還在github上發現了一個UIImage類(Link),它實現了您要查找的內容。它不具備非現有文件的回退功能,但您可以自己輕鬆實現。

+0

+1這是一個很大的範疇。感謝您的鏈接。但是,從技術上講,它已經對非現有圖像有一個回退 - 它只是返回'UIImage imageNamed:'方法,而不管原始名稱字符串是否傳入。這對我來說在這種情況下是理想的行爲。 –

+0

這就是我的想法。我最終做出了類似的UIImage類別。 – JoelF

2

沒有4「圖像類型,唯一不同於其他任何東西的是包含[email protected],它被用作iPhone 5的啓動圖像,並向操作系統發出信號表明您的應用程序支持更長的屏幕,並且應該不要使用letterboxed

您必須使用不同的屏幕尺寸處理代碼或自動佈局,沒有特殊的自動圖像類型,它既可以是標準屏幕圖像類型,也可以是視網膜圖像類型,與之前一樣自iOS 4以來。

0

在iOS 8的新API允許您加載一個名爲圖像的視網膜版本,以前你必須自己確定的文件名:

UIImage* retinaImage = [UIImage imageNamed:@"ImageName" 
    inBundle:nil compatibleWithTraitCollection:nil]; 

NSLog(@"screen scale: %2.2f retinaImage: %@", 
    [UIScreen mainScreen].nativeScale, retinaImage);