2012-10-04 24 views
12

चलो कहते हैं कि मैं एक बंडल या संपत्ति सूची में तीन छवियों करते हैं:UIImage imageNamed: स्वचालित रूप से @ 2x छवियों रेटिना लेने नहीं करता

  1. डिफ़ॉल्ट ~ iphone.png
  2. [email protected]~iphone.png
  3. [email protected]

आईओएस 4 और बाद में पर, UIImage निर्माता छवि नाम ले जा सकते हैं इस प्रकार है:

[UIImage imageNamed:@"Default"]; 

जब मैं 3.5 इंच रेटिना डिस्प्ले (आईफोन) पर हूं तो यह स्वचालित रूप से छवि (2) चुनता है। यदि एक गैर-रेटिना डिस्प्ले पर यह चुनता है (1)। यह भी खूब रही।

मैंने 4 इंच रेटिना (आईफोन 5) लॉन्च छवि के लिए निर्दिष्ट छवि 3 नाम दिया। क्या छवि (3) नाम देने का कोई तरीका है, ताकि जब मैं 4 इंच रेटिना डिस्प्ले पर चल रहा हूं, तो यह उसी यूआईएममेज कन्स्ट्रक्टर के साथ वापस आ जाएगा?

शायद यह अभी तक लागू नहीं हुआ है, या मैं सुविधा से बहुत अधिक उम्मीद करता हूं ... मैं स्क्रीन आयामों के आधार पर छवि को चुनने के लिए अपने कोड में किसी भी सशर्त तर्क से बचने की कोशिश कर रहा हूं।

उत्तर

12

मुझे भी यही समस्या थी और यह पता चला कि आईफोन 5/आईपॉड टच 5 वें पीढ़ी के लिए ऐसा कोई व्यवहार नहीं है।

आपको मैन्युअल रूप से यह निर्धारित करना होगा कि आपका ऐप ऐसे डिवाइस पर चल रहा है या उसके अनुसार फ़ाइल नाम बदलें।

मैं अगर मेरे अनुप्रयोग एक iPhone पर चल रहा है की जाँच करने के लिए इस विधि का उपयोग किया है 5/आइपॉड टच 5 वीं जनरल .:

#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"]; 
} 

अद्यतन
मुझे भी जिथब (Link) पर एक यूआईएममेज श्रेणी मिली जो कि आप जो खोज रहे हैं उसे लागू करती है। इसमें मौजूदा फाइलों के लिए फॉलबैक नहीं है, लेकिन आप इसे आसानी से कार्यान्वित कर सकते हैं।

+0

+1 यह एक बढ़िया वर्ग है। लिंक के लिए धन्यवाद। तकनीकी रूप से, हालांकि, यह पहले से मौजूद गैर-मौजूदा छवियों के लिए फॉलबैक है - यह केवल 'UIImage imageNamed:' विधि देता है जो मूल नाम स्ट्रिंग पास हो जाता है। यह मुझे ऐसे मामलों में वांछित व्यवहार के रूप में समझ में आता है। –

+0

यही मैंने सोचा था। मैं एक समान यूआईएममेज श्रेणी बनाने के लिए समाप्त हो गया। – JoelF

2

कोई 4 "छवि प्रकार नहीं है। केवल एक चीज जो अन्य सभी से अलग है [email protected] को शामिल करना जो आईफोन 5 के लिए लॉन्च छवि के रूप में उपयोग किया जाता है और ओएस को संकेत देता है कि आपका एप्लिकेशन लंबी स्क्रीन का समर्थन करता है और कंधे letterboxed नहीं है।

आपको कोड में या विभिन्न स्क्रीन आकारों के साथ ऑटोलाउआउट के साथ सौदा करना होगा। कोई विशेष, स्वचालित छवि प्रकार नहीं है। यह या तो एक मानक स्क्रीन छवि प्रकार या रेटिना छवि प्रकार है, जैसा कि यह किया गया है आईओएस 4.

0

iOS 8 में नई एपीआई आप एक नामित छवि की रेटिना संस्करणों को लोड करने के लिए अनुमति देता है, पहले आप फ़ाइल नाम अपने आप को निर्धारित करने के लिए किया था:

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

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