রেটিনা প্রদর্শন সনাক্ত করুন


223

বর্তমান ডিভাইসটিতে উচ্চ-রেজোলিউশন ডিসপ্লে (রেটিনা) রয়েছে কিনা তা কি আইওএস এসডিকে চেক করার সহজ উপায় সরবরাহ করে?

এখনই এটি করার সবচেয়ে ভাল উপায়টি হ'ল:

    if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] == YES && [[UIScreen mainScreen] scale] == 2.00) {
         // RETINA DISPLAY
    }

কৌতূহলের বাইরে - আপনি যখন আপনার শিল্পকর্মের আরও বড় সংস্করণগুলি দেখানোর পরিবর্তে প্রদর্শনটি সনাক্ত করেন তখন আপনি কী করছেন?
মাইকেল বেহান


@ এম্বেহান: আমার একটি টিটিআইমেজভিউ রয়েছে (থ্রি -২০ ফ্রেমওয়ার্ক দেখুন) এবং আমি চিত্রটির একটি উচ্চ-রেজোলিউশন url দিতে চাই।
পিয়েরে ভালাদে

1
এই প্রশ্নটি আমার পক্ষেও দরকারী কারণ আমি 4 টি প্রদর্শন আকারের জন্য ইউআই হিসাবে উপস্থিত চিত্রগুলি ডাউনলোড করেছি এবং কেবলমাত্র ব্যবহারকারীরা উপযুক্তটি ডাউনলোড করতে চাই।
পেড্রো

@ এম্বেহান: আমার ক্ষেত্রে আমি কাস্টম সেল বিভাজকগুলি চেয়েছিলাম যা রেটিনা এবং নন-রেটিনা উভয় স্ক্রিনে (দেশীয় বিভাজকগুলির মত) 1px। রেটিনা ডিসপ্লেতে (স্পষ্টতই) 1px রেন্ডারগুলিকে 2px এ সেট করা।
ব্যবহারকারী 3099609

উত্তর:


295

সমস্ত আইওএস ডিভাইসে রেটিনা প্রদর্শনটি নির্ভরযোগ্যভাবে সনাক্ত করতে, আপনাকে ডিভাইসটি iOS4 + চলছে এবং [UIScreen mainScreen].scaleসম্পত্তিটি 2.0 এর সমান কিনা তা পরীক্ষা করে দেখতে হবে। আপনি ধরে নিতে পারবেন না যে কোনও সম্পত্তি ডিভাইসটি iOS4 + চালাচ্ছে যদি scaleসম্পত্তিটি বিদ্যমান থাকে তবে আইপ্যাড 3.2 তেও এই সম্পত্তি রয়েছে।

আইওএস 3.২ চলমান একটি আইপ্যাডে স্কেল 1x মোডে 1.0 এবং 2x মোডে 2.0 ফিরে আসবে - যদিও আমরা জানি যে ডিভাইসে রেটিনা প্রদর্শন নেই। অ্যাপল আইপ্যাডের জন্য আইওএস 4.2 এ এই আচরণটি পরিবর্তন করেছে: এটি 1x এবং 2x উভয় মোডে 1.0 প্রদান করে। আপনি নিজেই এটি সিমুলেটারে পরীক্ষা করতে পারেন।

আমি -displayLinkWithTarget:selector:মূল স্ক্রিনে থাকা পদ্ধতির জন্য যা iOS4.x এ উপস্থিত রয়েছে তবে আইওএস ৩.২ এ পরীক্ষা করি না এবং তারপরে স্ক্রিনের স্কেল পরীক্ষা করে দেখি:

if ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] &&
    ([UIScreen mainScreen].scale == 2.0)) {
  // Retina display
} else {
  // non-Retina display
}

আপনি বলছেন যে "অ্যাপল আইপ্যাডের জন্য আইওএস ৪.২ এ এই আচরণটি পরিবর্তন করেছে", ইঙ্গিত করে যে আইওএস ৪.১-তে আপনার কোডটি "আইট্রি রেটিনা" আইপ্যাড অ্যাপ্লিকেশনটি 2 এক্স মোডে চলমান আইপ্যাডের জন্য "ইট রেটিনা" ফিরে আসবে। আমি কি ভূল?
মকদাদ

9
আইপ্যাডের জন্য কখনও 4.1 ছিল না। কেবল ৩.২, তারপরে ৪.২
জনি 18

11
এই কলটি কিছুটা ব্যয়বহুল তাই আমি অ্যাপটি শুরু করার সাথে সাথে এটি দিয়ে একটি BOOL শুরু করব এবং অ্যাপ্লিকেশনটিতে এটি ব্যবহার করব।
n13

আমি ব্যবহার করে সংস্করণটি পরীক্ষা করতে পছন্দ করি [UIDevice currentDevice].systemVersion]। এই ক্ষেত্রে এটি হবে NSString *currentSystemVersion = [[UIDevice currentDevice] systemVersion]; return [currentSystemVersion compare:version options:NSNumericSearch];
স্যান্ডি চ্যাপম্যান

এক্সকোড 4 ... নন রেটিনা আইপ্যাড (আইওএস 7.1) সিমুলেটারে কাজ করছে বলে মনে হচ্ছে না ird
আইজাক পল

81

@ সরিপের উত্তর সঠিক। কেবল জিনিসগুলিকে সহজ করার জন্য, এই অংশটি আপনার Shared.pch ফাইলে যুক্ত করুন:

#define IS_RETINA ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && ([UIScreen mainScreen].scale >= 2.0))

তারপরে যে কোনও ফাইলে আপনি কেবল এটি করতে পারেন:

if(IS_RETINA)
{
   // etc..
}

এটি সিমুলেটারে কাজ করে না। এটি প্রতিক্রিয়াশীলতার কারণে? সিমুলেটার কি নির্বাচককে সাড়া দেয় না?
আরনিওতাকি

2
গ্রেট! তবে আপনি যদি আইফোন 6 প্লাস অ্যাকাউন্টে নিতে চান তবে আপনার স্কেল> = ২.০ পরীক্ষা করা উচিত।
ইভান ক্যারোস্যাটি

20
+(BOOL)iPhoneRetina{
    return ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && ([UIScreen mainScreen].scale == 2.0))?1:0;
}

23
কেন ?1:0? এটি কি পুনরাবৃত্তি নয় যে ইতিমধ্যে অভিব্যক্তিটির বুলিয়ান অংশে গণনা করা হয়েছে?
d11wtq

9

এখানে একটি কার্যকর সুইফট এক্সটেনশান:

সুইফ্ট ভি 5 এর জন্য আপডেট করুন:

extension UIScreen {

    public var isRetina: Bool {
        guard let scale = screenScale else {
            return false
        }
        return scale >= 2.0
    }

    public var isRetinaHD: Bool {
        guard let scale = screenScale else {
            return false
        }
        return scale >= 3.0
    }

    private var screenScale: CGFloat? {
        guard UIScreen.main.responds(to: #selector(getter: scale)) else {
            return nil
        }
        return UIScreen.main.scale
    }
}

ব্যবহার:

if UIScreen.main.isRetina {
    // Your code
}

মূল:

extension UIScreen { 
public func isRetina() -> Bool {
    return screenScale() >= 2.0
}

public func isRetinaHD() -> Bool {
    return screenScale() >= 3.0
}

private func screenScale() -> CGFloat? {
    if UIScreen.mainScreen().respondsToSelector(Selector("scale")) {
        return UIScreen.mainScreen().scale
    }
    return nil
    }
}

ব্যবহার:

if UIScreen.mainScreen().isRetina() {
 // your code
        }

সুইডট 5 এর জন্য যে কোডটি আপডেট করতে হবে তা কি আইট্রিনএইচডি চেক করা উচিত নয় === 3.0 নয় কিনা ??? সম্পাদনা করুন: আমি এটি আপডেট করেছি ...
C0D3

6

এই স্নিপেট ...

    int d = 0; // standard display
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] && [[UIScreen mainScreen] scale] == 2.0) {
    d = 1; // is retina display
}

if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
    d += 2;
}

ফিরে আসবে ... স্ট্যান্ডার্ড রেজোলিউশন আইফোন / আইপড স্পর্শের জন্য 0, রেটিনা আইফোনের জন্য 1, স্ট্যান্ডার্ড রেজোলিউশন আইপ্যাডের জন্য 2, রেটিনা আইপ্যাডের জন্য 3।


6

এসস্টুলকিটের একটি পদ্ধতি রয়েছে যা এটি করে:

http://sstoolk.it/documentation/Categories/UIScreen(SSToolkitAdditions).html

এটি নিম্নলিখিত উপায়ে ব্যবহৃত হয়:

[[UIScreen mainScreen] isRetinaDisplay];

এই বিশেষ ব্যবহারটি এসএমএসক্যাটরিজগুলি এস এসস্টুলকিটের মধ্যে ছাড়িয়ে গেছে: [[ইউআইস স্ক্রিন] মূল_স্ক্রিন] সাম_আইস রেটিনা]

5

সাম্যের জন্য ভাসমান-পয়েন্টের মানগুলি তুলনা করতে এটি সর্বদা কিছুটা দ্বিধাদ্বন্দ্ব বোধ করে। আমি উভয় জন্য যেতে পছন্দ

[UIScreen mainScreen].scale > 1.0;

অথবা

[UIScreen mainScreen].scale < 2.0;

5
সমতার জন্য দুটি ভাসমান-বিন্দু মানের তুলনা করা "ডজ অনুভব করে", কারণ তারা গণনার পরে অবিচ্ছেদ্য মানগুলির থেকে কিছুটা পৃথক হতে পারে। তবে <বা> এর সাথে তুলনা করা ঠিক ততটাই পরিস্থিতি od এই ক্ষেত্রে, তবে, স্কেলটি ঠিক 1.0 বা 2.0 নয় এমন কোনও সুযোগ নেই, কারণ এটি হার্ডওয়্যার দ্বারা সংজ্ঞায়িত।
ফিশিনিয়ার

@ ফিশিনার যেমন পরামর্শ দেয় তেমন কিছু ব্যবহার করাই ভাল isRetina = [UIScreen mainScreen].scale > 1.95। @ 4x এর সাথে আসে তখন এতে স্থিতিস্থাপক হওয়ার উপকারও হবে :)
দানিয়াল আয়তেকিন

আমি দৃ strongly়ভাবে একমত না। যখন প্রয়োজন হয় না তখন কোডটি কম পাঠযোগ্য হয়। ভবিষ্যত-প্রমাণের পয়েন্টটির বৈধতা থাকতে পারে তবে আমি সন্দেহ করি যে শীঘ্রই আমাদের যে কোনও সময় 4x স্ক্রিন থাকবে (যদি তা হয়)।
রিকার্ডো সানচেজ-সায়েজ

ভুল। কেবলমাত্র এটি "হার্ডওয়্যার সংজ্ঞায়িত" হওয়ার কারণে কোনও উপায়ে এটি বোঝায় না যে আপনি তুলনা-এ-ফ্লোট সমস্যাটি এড়ান। (এটি অন্যের মতো কেবল একটি ফ্লোট।) কোনও ফ্লোটের মতো, সাধারণভাবে আপনি কখনই == ব্যবহার করতে পারবেন না, আপনাকে অবশ্যই>> বা <তুলনা ব্যবহার করতে হবে। নিশ্চিত সম্পর্কে> 1.5।
ফ্যাটি

2

এটি উপরের ম্যাট এমসির উত্তরের উপর একটি রিফ। কেবলমাত্র একটি বিভাগ UIScreen

#import "UIScreen+Util.h"

@implementation UIScreen (Util)

+ (BOOL) isRetinaDisplay {
    static BOOL retina = NO;
    static BOOL alreadyChecked = NO;
    if (!alreadyChecked) {
        UIScreen *mainScreen = self.mainScreen;
        if (mainScreen) {
            retina = mainScreen.scale > 1.0;
            alreadyChecked = YES;
        }
    }
    return retina;
}

@end

1
আমি সন্দেহ করি যে ক্যাচিংটি alreadyCheckedকৃত্রিম, তবে এটি ঠিক আছে।
ড্যান রোজনস্টার্ক

@ নিকোলেশুবেনকভ এই কারণেই আমি ইতিমধ্যে চেকড শেষ করে রেখেছি। সবচেয়ে খারাপ পরিস্থিতিতে, আপনি অতিরিক্ত সময় বা দু'বার যাচাই করার জন্য কোডটি চালান।
ড্যান রোজনস্টার্ক

আমি বোঝাতে চাইছি যখন একটি প্রক্রিয়া ইতিমধ্যে যাচাই করার চেষ্টা করবে যখন অন্য বর্তমানে এই মান অ্যাপটি পড়ছে তখন ক্র্যাশ হতে পারে। আমি এই লাইনটি যুক্ত করব: @ সিংক্রোনাইজ (ইতিমধ্যে চেকড) {ইতিমধ্যে চেকড = ইয়েস
Nik

2

উপরের উত্তরগুলির সুইফ্ট সংস্করণ,> = ২.০ স্কেল সহ এটি আইফোন ++ এবং আরও-বেশি-রেটিনা স্কেল সহ ভবিষ্যতের ডিভাইসগুলি অন্তর্ভুক্ত করে:

 if UIScreen.mainScreen().respondsToSelector(Selector("scale")) && UIScreen.mainScreen().scale >= 2.0 {
    // code executed only on Retina device
}

1

কেবলমাত্র @ সিক্পের উত্তর এবং @ এন 13 এর নীচের মন্তব্যগুলিকে একত্রিত করার জন্য আমি এটিকে একটি ইউআইএস স্ক্রিনে বিভাগে পরিণত করেছি যা সুন্দরভাবে কাজ করে বলে মনে হচ্ছে। চেকটি আপনি যখন প্রথমবার বলবেন তখনই করা হবে এবং তারপরে পরবর্তী কলের জন্য সংরক্ষণ করা হবে।

@interface UIScreen (RetinaCheck)
+ (BOOL)retinaScreen;
@end

static BOOL isRetinaScreen = NO;
static BOOL didRetinaCheck = NO;

@implementation UIScreen (RetinaCheck)
+ (BOOL)retinaScreen
{
    if (!didRetinaCheck) {
        isRetinaScreen = ([[self mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] &&
                          ([self mainScreen].scale == 2.0));
        didRetinaCheck = YES;
    }
    return isRetinaScreen;
}
@end

কারও কাজে লাগতে পারে।


ক্যাচিং কোডের জন্য ধন্যবাদ। আমার একমাত্র পরামর্শ হ'ল এর (Util)পরিবর্তে এটি করা (RetinaCheck)... সম্ভবত এটি কম পরিষ্কার, তবে এটি অন্যান্য ব্যবহারের জন্য নিজেকে ধার দেয়। এছাড়াও আমি সেই পদ্ধতি isRetinaDisplayবা এমন কিছুটির নাম উল্লেখ করব যা দিয়ে শুরু হয় isতবে আমি কখনই ওবজ-সি-র জন্য গাইডলাইন বুঝতে পারি নি। এছাড়াও, আমি একজন অনুরাগী > 1.0কিন্তু কে জানে কী এগিয়ে যাওয়ার অর্থ হবে।
ড্যান রোজনস্টার্ক

1
// .h
UIKIT_EXTERN bool isRetinaDisplay();

// .m
bool isRetinaDisplay()
{
    static bool flag;
#ifdef __BLOCKS__
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        if([[UIScreen mainScreen] respondsToSelector:@selector(scale)])
        {
            flag = [[UIScreen mainScreen] scale] > 1.0;
        }
        else
        {
            flag = false;
        }
    });
#else
    static bool onceToken;
    if(onceToken == false)
    {
        onceToken = true;
        if([[UIScreen mainScreen] respondsToSelector:@selector(scale)])
        {
            flag = [[UIScreen mainScreen] scale] > 1.0;
        }
        else
        {
            flag = false;
        }
    }
#endif
    return flag;
}

আমি মনে করি হিসাবে সেরা সমাধান।
নিকোলে শুবেনকভ

0

এটা চেষ্টা কর

if ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] &&
    ([UIScreen mainScreen].scale == 2.0))
{
    // Retina display
    NSLog(@"---------------Retina display");
} else {
    // non-Retina display
    NSLog(@"---------------non-Retina display");
}

0

বেশিরভাগ সাধারণ ব্যবহারের ক্ষেত্রে সরলতার জন্য প্রিমুলাওয়ারিসের পরিবর্তিত সংস্করণ। আমি দ্রুত 2.2 এ আছি তবে এটি কোনও বিষয় নয়।

extension UIScreen {
    static var isRetina: Bool {
        return screenScale >= 2.0
    }

    static var isRetinaHD: Bool {
        return screenScale >= 3.0
    }

    static var screenScale:CGFloat {
        return UIScreen.mainScreen().scale
    }
}

তারপরে এগুলি কেবল তাদের মতো ব্যবহার করুন

print(UIScreen.isRetina)
print(UIScreen.isRetinaHD)
print(UIScreen.screenScale)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.