2012-06-16 14 views
15

मैक ओएस एक्स 10.7 पर चलने वाले कोको एप्लिकेशन को देखते हुए और बाद में:मैक ओएस एक्स: रेटिना डिस्प्ले के लिए रनटाइम चेक करने का सबसे अच्छा तरीका?

यदि आपका ऐप वर्तमान में कम से कम एक रेटिना डिस्प्ले वाला मैक पर चल रहा है, तो रनटाइम पर जांचने का सबसे अच्छा तरीका क्या है?

यदि इस तरह की चीज़ की जांच करना वास्तव में गलत है, तो मैं पूरी तरह से एक तर्कसंगत स्पष्टीकरण का स्वागत करता हूं (और यदि वे अच्छे हैं तो मैं ऐसे उत्तरों को अप-वोट दूंगा)।

लेकिन मुझे अभी भी पता होना चाहिए :)।

ऐसा लगता है कि आप विशेष रूप से नए मैक बुक प्रो "रेटिना" हार्डवेयर (एकमात्र मैक जिसमें वर्तमान में रेटिना डिस्प्ले है) के लिए एक चेक कर सकता है, लेकिन मैं वास्तव में अधिक सामान्य/जेनेरिक/भविष्य- इस से जांचने के लिए सबूत तरीका।

आदर्श रूप से, मैं जानना चाहता हूं कि रेटिना डिस्प्ले का पता कैसे लगाया जाए, न कि विशिष्ट मैक मॉडल जो वर्तमान में रेटिना डिस्प्ले के साथ जहाज के साथ होता है।

उत्तर

31

यदि आपको वास्तव में ऐसा करने की आवश्यकता है, तो -[NSScreen backingScaleFactor] पर एक नज़र डालें। लेकिन, यह कम से कम प्रतीत होता है, कम से कम बिना यह जानने के कि आप क्यों जानना चाहते हैं।

जबकि वर्तमान में रेटिना डिस्प्ले वाला केवल एक मैक है, तो अंततः रेटिना (और रनटाइम पर संलग्न/अलग किया जा सकता है) का समर्थन करने वाले स्टैंडअलोन डिस्प्ले हो सकते हैं और आप अंतर्निहित रेटिना डिस्प्ले को 1x में कॉन्फ़िगर करने में सक्षम हो सकते हैं मोड। इस प्रकार सवाल का जवाब "क्या एक रेटिना डिस्प्ले संलग्न है" किसी भी समय बदल सकता है।

इसके बजाय, आप जान सकते हैं कि -convert*ToBacking: विधियों या -[NSWindow backingScaleFactor] का उपयोग करके आपकी सामग्री को किसी दिए गए पैमाने के साथ खींचा जाना चाहिए या नहीं। एक टन अधिक जानकारी के लिए, डब्ल्यूडब्ल्यूडीसी 2012 सत्र वीडियो "ओएस एक्स पर उच्च रिज़ॉल्यूशन के लिए उन्नत टिप्स और ट्रिक्स" देखें (जब पोस्ट किया जाता है, उम्मीद है कि अगले कुछ हफ्तों में)।

+4

+1, ओपी को भी [ओएस एक्स के लिए उच्च संकल्प दिशानिर्देश] पढ़ना चाहिए (https://developer.apple.com/library/mac/#documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Introduction/Introduction.html)। –

+3

ऐसा करने के लिए गलत नहीं है। आईपैड और आईफ़ोन को सही संसाधन प्रदान करने के लिए वेब साइट्स को पूरी तरह से करने की आवश्यकता है, तो ऐप्स के लिए यह अलग क्यों होना चाहिए? बेशक, यह ओएस को सरल परिसंपत्ति-स्वैपिंग मामले (यानी, @ 2x केस) में करने के बजाय * की अपनी जांच करने के लिए गलत है। :) –

+2

एक वेब ब्राउज़र को 2x छवियों को डाउनलोड करने की आवश्यकता हो सकती है, लेकिन केवल अगर ब्राउज़र के लिए विंडो 2x डिस्प्ले पर है ... जो ऊपर उल्लिखित कारणों से किसी भी समय बदल सकती है। – tjw

5

ठीक है, आईओएस पर आप UIScreen.scale संपत्ति का उपयोग करते हैं। यदि यह 2.0 देता है, तो आप एक उच्च रिज़ॉल्यूशन डिस्प्ले वाले डिवाइस पर हैं। अन्यथा आप कम-रिज़ॉल्यूशन डिवाइस पर हैं।

तो मुझे लगता है कि मैक ओएस पर आप -[NSScreen backingScaleFactor] या -[NSWindow backingScaleFactor] का उपयोग कर सकते हैं।

+2

backingScaleFactor एक वर्ग विधि नहीं है। तो, यह [[एनएसएसस्क्रीन मुख्यस्क्रीन] बैकिंगस्केल फैक्टर] या [एनएसएसस्क्रीन स्क्रीन] में से एक होना चाहिए। – erkanyildiz

+0

कृपया '- [एनएसएसस्क्रीन बैकिंगस्केल फैक्टर]' के बारे में भूल जाएं, करने का सही तरीका विंडो के स्केल फैक्टर के आधार पर आपके ड्राइंग कोड को अनुकूलित करना है। प्रणाली यह निर्धारित करने के लिए ज़िम्मेदार है कि किसी दिए गए विंडो के लिए कौन सा स्केल फैक्टर उपयुक्त है। –

+1

@ मिचमाज़ाहेरी: कभी-कभी आपको ड्राइंग के लिए इसकी आवश्यकता नहीं होती है। मेरे मामले में मैं एकाधिक स्क्रीन से एक स्क्रीनशॉट ले रहा हूं और फिर आपको सटीक पिक्सेल-स्थिति की गणना करनी होगी। - [एनएसएसस्क्रीन बैकिंगस्केल फैक्टर] जाने का रास्ता है। –

8

मैं सिर्फ एक उदाहरण है जहाँ मैं अगर किसी भी स्क्रीन उच्च संकल्प था पता लगाने के लिए की जरूरत में भाग, इस काम किया

float displayScale = 1; 
    if ([[NSScreen mainScreen] respondsToSelector:@selector(backingScaleFactor)]) { 
     NSArray *screens = [NSScreen screens]; 
     for (int i = 0; i < [screens count]; i++) { 
      float s = [[screens objectAtIndex:i] backingScaleFactor]; 
      if (s > displayScale) 
       displayScale = s; 
     } 
    } 
+4

आप तेजी से पुनरावृत्ति के बारे में जानें 'के लिए (एनएसएसस्क्रीन * स्क्रीन [एनएसएसस्क्रीन स्क्रीन] में स्क्रीन)'? आपको बहुत सारे टाइपिंग बचाता है (और रनटाइम पर तेज़ है)। – DarkDust

+0

हाँ, यह एक काम करता है! थम्स अप! फ्लोट डिस्प्लेस्केल = 1.0; अगर ([[एनएसएसस्क्रीन मुख्यस्क्रीन] प्रतिक्रिया देता है तो चयनकर्ता: @ चयनकर्ता (बैकिंगस्केल फैक्टर)] {के लिए (एनएसएसस्क्रीन * स्क्रीन [एनएसएसस्क्रीन स्क्रीन] में) {फ्लोट एस = [स्क्रीन बैकिंगस्केल फैक्टर]; यदि (एस> डिस्प्लेस्केल) displayScale = s; }} एनएसएलओजी (@ "डिस्प्लेस्केल =% एफ", डिस्प्लेस्केल); फ्लोट x0 = displayScale * self.frame.origin.x; फ्लोट y0 = displayScale * self.frame.origin.y; float w0 = displayScale * self.frame। size.width; float h0 = displayScale * self.frame.size.height; NSLog (@ "x =% f; y =% f; w =% f'h =% f", x0, y0, w0, h0) ; –

संबंधित मुद्दे