ডিভাইসটি আইফোন এক্স কিনা তা সনাক্ত করুন


262

আমার আইওএস অ্যাপ্লিকেশনটি কাস্টম উচ্চতা ব্যবহার করে UINavigationBarযার ফলে নতুন আইফোন এক্সে কিছু সমস্যা দেখা দেয়।

যদি কোনও অ্যাপ্লিকেশন আইফোন এক্সে চলমান থাকে তবে প্রোগ্রামযুক্তভাবে (উদ্দেশ্য-সি তে) কীভাবে নির্ভরযোগ্যভাবে সনাক্ত করা যায় তা কি কেউ জানেন ?

সম্পাদনা করুন:

অবশ্যই পর্দার আকার চেক করা সম্ভব, তবে আমি ভাবছি TARGET_OS_IPHONEআইওএস সনাক্ত করার মতো কিছু "বিল্ট ইন" পদ্ধতি আছে কিনা ...

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
    CGSize screenSize = [[UIScreen mainScreen] bounds].size;
    if (screenSize.height == 812)
        NSLog(@"iPhone X");
}

সম্পাদনা 2:

আমি মনে করি না যে, আমার প্রশ্নটি লিঙ্কযুক্ত প্রশ্নের সদৃশ। অবশ্যই, বর্তমান ডিভাইসের বিভিন্ন বৈশিষ্ট্য "পরিমাপ" করার এবং কোন ডিভাইস ব্যবহার করা হয়েছে তা সিদ্ধান্ত নেওয়ার জন্য ফলাফলগুলি ব্যবহার করার পদ্ধতি রয়েছে। যাইহোক, এটি আমার প্রশ্নের আসল পয়েন্ট ছিল না কারণ আমি আমার প্রথম সম্পাদনায় জোর দেওয়ার চেষ্টা করেছি।

আসল প্রশ্নটি হ'ল: "বর্তমান ডিভাইসটি আইফোন এক্স কিনা (উদাহরণস্বরূপ কোনও এসডিকে বৈশিষ্ট্য দ্বারা) তা কি সরাসরি সনাক্ত করা সম্ভব বা আমাকে পরোক্ষ পরিমাপ ব্যবহার করতে হবে" ?

এখনও অবধি দেওয়া উত্তর দ্বারা, আমি ধরে নিয়েছি যে উত্তরটি "না, কোনও সরাসরি পদ্ধতি নেই। পরিমাপগুলি হ'ল উপায়"।


আইফোন এক্স এর স্ক্রিন রেজোলিউশন অন্যদের থেকে আলাদা।
এল টমেটো

2
হ্যাঁ, আমি আমার সম্পাদনায় উল্লেখ করেছি যে পর্দার আকার চেক করা সম্ভব। তবে প্রশ্নটি হল, "অপ্রত্যক্ষ" পরিমাপের পরিবর্তে ডিভাইসের ধরণের প্রশ্নের জন্য যদি "সরাসরি" পদ্ধতি থাকে ...
আন্দ্রে হার্ফোর্ড

3
লেখক কেবল স্ক্রিন রেজুলেশন নয়, ডিভাইসের ধরণটি পেতে চান। সরাসরি মেশিনের নাম চেক করবেন না কেন? @ লুবিলিস ঠিক আছে।
Itachi

2
আপনি কেবল সেফ-এরিয়া গাইড ব্যবহার করেন না কেন এটি অ্যাপল দ্বারা সুপারিশ করা হয়েছে?
হোলএক্স

4
গুরুত্বপূর্ণ, ভবিষ্যত ডেভস: বর্তমান শীর্ষ সমাধানগুলি যেমন বোঝায় এটি পর্দার উচ্চতা সনাক্ত করবেন না, এটি খারাপ কারণ এটি ভবিষ্যতের ডিভাইসগুলির জন্য মিথ্যা ধনাত্মক হতে পারে; যদি ইউআইওয়াইন্ডো এখনও রেন্ডার না করে তবে কাজ করবে না (যেমন আপনার অ্যাপডেলিগেট থ্রি ফাংশনের মতো), ল্যান্ডস্কেপ অ্যাপ্লিকেশনগুলিতে কাজ করবে না এবং স্কেল সেট করা থাকলে সিমুলেটারে ব্যর্থ হতে পারে। এই জাতীয় জিনিসের জন্য কখনও ম্যাজিক নম্বর ব্যবহার করবেন না! সাফল্যের গ্যারান্টি দিতে আপনি হার্ডওয়্যার পতাকাগুলি পরীক্ষা করতে পারেন যেমন আমি এখানে করেছি: stackoverflow.com/a/51511947/2057171
অ্যালবার্ট রেনশো

উত্তর:


383

আপনার প্রশ্নের উপর ভিত্তি করে, উত্তর না হয়। সরাসরি কোনও পদ্ধতি নেই। আরও তথ্যের জন্য আপনি এখানে তথ্য পেতে পারেন:

এবং

আইফোন এক্স এর উচ্চতা 2436 পিক্সেল

থেকে ডিভাইস পর্দা মাপ এবং রেজুলেশন :

এখানে চিত্র বর্ণনা লিখুন

থেকে ডিভাইস স্ক্রিন মাপ ও ওরিয়েন্টেশন :

এখানে চিত্র বর্ণনা লিখুন

সুইফট 3 এবং তারপরে :

if UIDevice().userInterfaceIdiom == .phone {
    switch UIScreen.main.nativeBounds.height {
        case 1136:
            print("iPhone 5 or 5S or 5C")

        case 1334:
            print("iPhone 6/6S/7/8")

        case 1920, 2208:
            print("iPhone 6+/6S+/7+/8+")

        case 2436:
            print("iPhone X/XS/11 Pro")

        case 2688:
            print("iPhone XS Max/11 Pro Max")

        case 1792:
            print("iPhone XR/ 11 ")

        default:
            print("Unknown")
        }
    }

উদ্দেশ্য-সি :

if([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
    switch ((int)[[UIScreen mainScreen] nativeBounds].size.height) {
        case 1136:
            printf("iPhone 5 or 5S or 5C");
                break;

        case 1334:
            printf("iPhone 6/6S/7/8");
            break;

        case 1920, 2208:
            printf("iPhone 6+/6S+/7+/8+");
            break;

       case 2436:
            print("iPhone X/XS/11 Pro");
             break;

        case 2688:
            print("iPhone XS Max/11 Pro Max");
             break;

        case 1792:
            print("iPhone XR/ 11 ");
             break;

        default:
            printf("Unknown");
            break;
    }
}

Xamarin.iOS :

if (UIDevice.CurrentDevice.UserInterfaceIdiom == UIUserInterfaceIdiom.Phone) {
    if ((UIScreen.MainScreen.Bounds.Height * UIScreen.MainScreen.Scale) == 1136) {
        Console.WriteLine("iPhone 5 or 5S or 5C");
    } else if ((UIScreen.MainScreen.Bounds.Height * UIScreen.MainScreen.Scale) == 1334) {
        Console.WriteLine("iPhone 6/6S/7/8");
    } else if ((UIScreen.MainScreen.Bounds.Height * UIScreen.MainScreen.Scale) == 1920 || (UIScreen.MainScreen.Bounds.Height * UIScreen.MainScreen.Scale) == 2208) {
        Console.WriteLine("iPhone 6+/6S+/7+/8+");
    } else if ((UIScreen.MainScreen.Bounds.Height * UIScreen.MainScreen.Scale) == 2436) {
        Console.WriteLine("iPhone X, XS, 11 Pro");
    } else if ((UIScreen.MainScreen.Bounds.Height * UIScreen.MainScreen.Scale) == 2688) {
        Console.WriteLine("iPhone XS Max, 11 Pro Max");
    } else if ((UIScreen.MainScreen.Bounds.Height * UIScreen.MainScreen.Scale) == 1792) {
        Console.WriteLine("iPhone XR, 11");
    } else {
        Console.WriteLine("Unknown");
    }
}

আপনার প্রশ্নের উপর ভিত্তি করে অনুসরণ করুন:

বা screenSize.heightভাসমান হিসাবে 812.0f না হিসাবে ব্যবহার করুন 812

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
    CGSize screenSize = [[UIScreen mainScreen] bounds].size;
        // 812.0 on iPhone X, XS
        // 896.0 on iPhone XS Max, XR.

    if (screenSize.height >= 812.0f)
        NSLog(@"iPhone X");
    }

আরও তথ্যের জন্য আপনি আইওএস হিউম্যান ইন্টারফেস নির্দেশিকাতে নিম্নলিখিত পৃষ্ঠাটি উল্লেখ করতে পারেন:

সুইফট :

এর সাথে সনাক্ত করুন topNotch:

যদি কেউ আইফোনএক্স সনাক্ত করতে খাঁজ ব্যবহার করার বিষয়টি বিবেচনা করে থাকেন তবে মনে রাখবেন যে "ল্যান্ডস্কেপ" এ সমস্ত আইফোনের জন্য একই রকম same

var hasTopNotch: Bool {
    if #available(iOS 13.0,  *) {
        return UIApplication.shared.windows.filter {$0.isKeyWindow}.first?.safeAreaInsets.top ?? 0 > 20
    }else{
     return UIApplication.shared.delegate?.window??.safeAreaInsets.top ?? 0 > 20
    }

    return false
}

উদ্দেশ্য-সি :

- (BOOL)hasTopNotch {
   if (@available(iOS 13.0, *)) {
       return [self keyWindow].safeAreaInsets.top > 20.0;
   }else{
       return [[[UIApplication sharedApplication] delegate] window].safeAreaInsets.top > 20.0;
   }
   return  NO;
}

- (UIWindow*)keyWindow {
    UIWindow        *foundWindow = nil;
    NSArray         *windows = [[UIApplication sharedApplication]windows];
    for (UIWindow   *window in windows) {
        if (window.isKeyWindow) {
            foundWindow = window;
            break;
        }
    }
    return foundWindow;
}

আপডেট :

userInterfaceIdiomডিভাইসের প্রকারটি সনাক্ত করতে সম্পত্তিটি ব্যবহার করবেন না , কারণ ব্যবহারকারী হিসাবে ইন্টারফেসআইডিয়োমের ডকুমেন্টেশন ব্যাখ্যা করে:

সর্বজনীন অ্যাপ্লিকেশনগুলির জন্য, আপনি এই বৈশিষ্ট্যটি কোনও নির্দিষ্ট ধরণের ডিভাইসের জন্য আপনার অ্যাপ্লিকেশনটির আচরণটি উপযুক্ত করতে ব্যবহার করতে পারেন। উদাহরণস্বরূপ, আইফোন এবং আইপ্যাড ডিভাইসের বিভিন্ন স্ক্রিনের আকার রয়েছে, তাই আপনি বর্তমান ডিভাইসের ধরণের ভিত্তিতে বিভিন্ন মতামত এবং নিয়ন্ত্রণ তৈরি করতে চাইতে পারেন।

অর্থাৎ, এই সম্পত্তিটি কেবল চলমান অ্যাপ্লিকেশনটির দর্শন শৈলীর শনাক্ত করতে ব্যবহৃত হয়েছে। যাইহোক, আইফোন অ্যাপটি (সর্বজনীন নয়) অ্যাপ স্টোরের মাধ্যমে আইপ্যাড ডিভাইসে ইনস্টল করা যেতে পারে, userInterfaceIdiomসেক্ষেত্রে UIUserInterfaceIdiomPhone, এটিও ফিরে আসবে ।

সঠিক ভাবে মাধ্যমে মেশিন নাম পেতে হয় uname। বিশদ জন্য নিম্নলিখিত পরীক্ষা করুন:


আইফোন এক্স এর রেজোলিউশনটি 2436 x 1125 পিক্সেল অনুসারে: iphonesoft.fr/2017/09/12/…
মেধী

1
@ মেধী - আইফোন এক্স এর রেজোলিউশনটি হ'ল - 1125 x 2436 পিক্সেল (458 পিপিআই পিক্সেল ঘনত্ব)
আনবু.কার্তিক

14
না! আইফোন অ্যাপটি (মহাবিশ্ব নয়) অ্যাপ স্টোরের মাধ্যমে আইপ্যাড ডিভাইসে ইনস্টল করা যেতে পারে,userInterfaceIdiomসেক্ষেত্রেUIUserInterfaceIdiomPhone, এটিওফিরে আসবে। এই উত্তরটি ভুল।
Itachi

1
@ থ্রিকিনস, দয়া করে লিও ডাবাসের পরামর্শ অনুযায়ী প্লাস ডিভাইসের জন্য আপনার উত্তরটি আপডেট করুন। এটি ডিভাইসে নয় প্লাস সিমুলেটারে কাজ করে।
হিরেন গুজরাটি

2
এটি খারাপ কারণ এটি ভবিষ্যতের ডিভাইসগুলির জন্য মিথ্যা ধনাত্মক হতে পারে; UIWindow এখনও রেন্ডার না করলে (অ্যাপডেলিগেট) কাজ করবে না, ল্যান্ডস্কেপ অ্যাপ্লিকেশনগুলিতে কাজ করবে না এবং স্কেল সেট করা থাকলে সিমুলেটারে ব্যর্থ হতে পারে। সাফল্যের গ্যারান্টি হিসাবে আপনি এখানে হার্ডওয়ারের পতাকাগুলি পরীক্ষা করতে পারেন: stackoverflow.com/a/51511947/2057171
অ্যালবার্ট রেনশো

101

আর একটি সম্ভাবনা যা আইওএস ১১ এবং আইওএস ১২ এ কাজ করে কারণ আইফোন এক্স একমাত্র শীর্ষে একটি খাঁজ এবং ৪৪ এর ইনসেট রয়েছে That আমি এখানে সত্যিই এটি সনাক্ত করছি:

উদ্দেশ্য গ:

    BOOL iPhoneX = NO;
    if (@available(iOS 11.0, *)) {
        UIWindow *mainWindow = [[[UIApplication sharedApplication] delegate] window];
        if (mainWindow.safeAreaInsets.top > 24.0) {
            iPhoneX = YES;
        }
    }

সুইফট 4:

/// Has safe area
///
/// with notch: 44.0 on iPhone X, XS, XS Max, XR.
///
/// without notch: 20.0 on iPhone 8 on iOS 12+.
///
static var hasSafeArea: Bool {
    guard #available(iOS 11.0, *), let topPadding = UIApplication.shared.keyWindow?.safeAreaInsets.top, topPadding > 24 else {
        return false
    }
    return true
}

এবং অবশ্যই, আপনি ল্যান্ডস্কেপ অভিযোজনে থাকলে আপনার বাম এবং ডান নিরাপদ অঞ্চল ইনসেটগুলি পরীক্ষা করতে হবে।

সম্পাদনা করুন: _উন্ডো হ'ল অ্যাপডেলিগেটের ইউআই উইন্ডো, যেখানে এই চেকটি অ্যাপ্লিকেশনটিতে ফিনিশলঞ্চিং উইথঅপশনগুলি করা হয়।

শীর্ষে 0 0 এর চেয়ে শীর্ষ> 24 কিনা তা পরীক্ষা করতে আইওএস 12 এর জন্য উত্তর আপডেট হয়েছে।

সম্পাদনা: সিমুলেটারে আপনি হার্ডওয়্যার, টগল ইন কল স্ট্যাটাস বারে যেতে পারেন। এটি করা আমাকে দেখায় যে কোনও কলে জড়িত থাকার সময় আইওএস 11 বা আইফোন এক্সএস আইওএস 12 এ আইফোন এক্সে স্ট্যাটাস বারের উচ্চতা পরিবর্তন হয় না। সমস্ত পরিবর্তনগুলি হ'ল সময় আইকন, যা সবুজ ক্ষেত্রেই সবুজ পটভূমি পায়। এখানে একটি স্ন্যাপ:

এখানে চিত্র বর্ণনা লিখুন


5
নিরাপদ অঞ্চল পোকামাকড়ের অন্যান্য ডিভাইসে স্থিতি দণ্ডের উচ্চতা থাকবে one এটি 0 হয় কিনা তা পরীক্ষা করা কেবল স্ট্যাটাস বারটি দৃশ্যমান কিনা তা আপনাকে জানায়, ডিভাইসটি আইফোন এক্স না হলে নয়
IMCD23

3
"এটি আইফোন এক্স বা আইফোন 11 এ ভেঙে যেতে পারে ", কুক বলেছিলেন।
Itachi

11
আমি কিছুটা মানিয়ে নিয়েছি এবং if _window.safeAreaInsets != UIEdgeInsets.zeroযেকোন ডিভাইস অভিযোজনের অনুমতি দেওয়ার জন্য ব্যবহার করেছি
ফ্রেজার

2
আপনি ব্যবহার করতে না চান তাহলে .top, safeAreaInsets.bottomঅন্য ডিভাইসে আইফোন X এ 34 এবং 0 হতে হবে
blwinters

7
সতর্কতা: এটি ব্যবহার করবেন না, এটি আইওএস १२ এ ব্রেক হয়ে যায়। ইউআই উইন্ডোর এই ক্ষেত্রে কী করা উচিত তাও নথিভুক্ত করা হয়নি। openradar.appspot.com/42372793
স্টিপেট

73

আপনি আসল প্রয়োজনের উপর নির্ভর করে আইফোন এক্সের বিভিন্ন সনাক্তকরণ করতে পারবেন।

শীর্ষ খাঁজ (স্ট্যাটাসবার, নাভবার), ইত্যাদির সাথে ডিল করার জন্য

class var hasTopNotch: Bool {
    if #available(iOS 11.0, tvOS 11.0, *) {
        // with notch: 44.0 on iPhone X, XS, XS Max, XR.
        // without notch: 24.0 on iPad Pro 12.9" 3rd generation, 20.0 on iPhone 8 on iOS 12+.
        return UIApplication.shared.delegate?.window??.safeAreaInsets.top ?? 0 > 24
    }
    return false
}

নীচে হোম ইন্ডিকেটর (ট্যাববার), ইত্যাদি ব্যবহার করার জন্য

class var hasBottomSafeAreaInsets: Bool {
    if #available(iOS 11.0, tvOS 11.0, *) {
        // with home indicator: 34.0 on iPhone X, XS, XS Max, XR.
        // with home indicator: 20.0 on iPad Pro 12.9" 3rd generation.
        return UIApplication.shared.delegate?.window??.safeAreaInsets.bottom ?? 0 > 0
    }
    return false
}

পটভূমির আকার, পূর্ণস্ক্রিন বৈশিষ্ট্য ইত্যাদির জন্য

class var isIphoneXOrBigger: Bool {
    // 812.0 on iPhone X, XS.
    // 896.0 on iPhone XS Max, XR.
    return UIScreen.main.bounds.height >= 812
}

দ্রষ্টব্য: শেষ পর্যন্ত নোটের সাথে এটি মিশ্রিত UIDevice.current.userInterfaceIdiom == .phone
করুন: এই পদ্ধতির জন্য একটি লঞ্চস্ক্রিন স্টোরিবোর্ড বা যথাযথ LaunchImages থাকা দরকার

ব্যাকগ্রাউন্ড অনুপাত, স্ক্রোলিং বৈশিষ্ট্য ইত্যাদির জন্য

class var isIphoneXOrLonger: Bool {
    // 812.0 / 375.0 on iPhone X, XS.
    // 896.0 / 414.0 on iPhone XS Max, XR.
    return UIScreen.main.bounds.height / UIScreen.main.bounds.width >= 896.0 / 414.0
}

দ্রষ্টব্য: এই পদ্ধতির জন্য একটি লঞ্চস্ক্রিন স্টোরিবোর্ড বা যথাযথ LaunchImages থাকা দরকার

বিশ্লেষণ, পরিসংখ্যান, ট্র্যাকিং ইত্যাদির জন্য

মেশিন শনাক্তকারী পান এবং এটি নথিভুক্ত মানগুলির সাথে তুলনা করুন:

class var isIphoneX: Bool {
    var size = 0
    sysctlbyname("hw.machine", nil, &size, nil, 0)
    var machine = [CChar](repeating: 0, count: size)
    sysctlbyname("hw.machine", &machine, &size, nil, 0)
    let model = String(cString: machine)
    return model == "iPhone10,3" || model == "iPhone10,6"
}

আপনার বিশ্লেষণে বৈধ আইফোন এক্স হিসাবে সিমুলেটরটি অন্তর্ভুক্ত করতে:

class var isIphoneX: Bool {
    let model: String
    if TARGET_OS_SIMULATOR != 0 {
        model = ProcessInfo.processInfo.environment["SIMULATOR_MODEL_IDENTIFIER"] ?? ""
    } else {
        var size = 0
        sysctlbyname("hw.machine", nil, &size, nil, 0)
        var machine = [CChar](repeating: 0, count: size)
        sysctlbyname("hw.machine", &machine, &size, nil, 0)
        model = String(cString: machine)
    }
    return model == "iPhone10,3" || model == "iPhone10,6"
}

আইফোন এক্সএস, এক্সএস ম্যাক্স এবং এক্সআর অন্তর্ভুক্ত করতে কেবল "আইফোন 11," দিয়ে শুরু হওয়া মডেলগুলি সন্ধান করুন:

return model == "iPhone10,3" || model == "iPhone10,6" || model.starts(with: "iPhone11,")

ফেসআইডি সমর্থন জন্য

import LocalAuthentication
/// will fail if user denies canEvaluatePolicy(_:error:)
class var canUseFaceID: Bool {
    if #available(iOS 11.0, *) {
        return LAContext().biometryType == .typeFaceID
    }
    return false
}

আমি আশা করছিলাম যে return LAContext().biometryType == .typeFaceIDব্যবহারকারী যদি এভেলুয়েটপলিসিকে অস্বীকার করেও কাজ করে তবে এটি আমার পক্ষে কাজ করে না, এটি এখনও ফিরে আসে.none
জেরেমি

আচ্ছা @ জেরেমি, এটি একটি নথিভুক্ত আচরণ, অ্যাপলের গোপনীয়তার নীতিমালা যে কারণে পদ্ধতির উপরে মন্তব্য।
সিউর

আহ, আমি আপনার মন্তব্যের ভুল ব্যাখ্যা দিয়েছি। আমি ভেবেছিলাম আপনার ব্যবহারের অর্থ এভেলুয়েটপলিসি ব্যর্থ হতে পারে তাই এর পরিবর্তে নিম্নলিখিতটি ব্যবহার করুন। আমি এটি কিছুটা অদ্ভুত বলে মনে করি যে ব্যবহারকারী টগলটিতে প্রতিক্রিয়া না জানিয়ে অবধি ডিভাইসটির ফেস আইডি রয়েছে কিনা তা পরীক্ষা করার অনুমতি দেওয়া হচ্ছে এবং তারপরে আপনি আরও চেক করতে পারবেন না। সেটিংসে যেতে এবং ফেস আইডি টগল করতে বলার জন্য কীভাবে আমার একটি সহায়ক ত্রুটি বার্তা সরবরাহ করার কথা?
জেরেমি

@ জেরেমি আমার আইফোন এক্স নেই, তাই আমি জানি না। হতে পারে আপনি উপরে মডেল সনাক্তকরণ ( model == "iPhone10,3" || model == "iPhone10,6") ব্যবহার করতে পারেন , এবং যদি canUseFaceIDমিথ্যা প্রত্যাবর্তন হয় তবে এর অর্থ এটি ব্যবহারকারী দ্বারা প্রত্যাখ্যান করা হয়েছিল।
সিউর

1
@ মেটেওলায়া আমার উত্তরের কোনও কিছুই অ্যাপল প্রত্যাখ্যান করবে না: আপনি এগুলি সবই ব্যবহার করতে পারেন।
সিউর

42

আপনি মাত্রা অনুসারে আইফোন এক্স ডিভাইস সনাক্ত করতে এটি করতে পারেন ।

দ্রুতগতি

if UIDevice().userInterfaceIdiom == .phone && UIScreen.main.nativeBounds.height == 2436 {
   //iPhone X
}

উদ্দেশ্য গ

if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone && UIScreen.mainScreen.nativeBounds.size.height == 2436)  {
  //iPhone X     
}

এখানে চিত্র বর্ণনা লিখুন

কিন্তু ,

এটি যথেষ্ট উপায় নয়। যদি অ্যাপল আইফোন এক্স এর একই মাত্রা সহ পরবর্তী আইফোন ঘোষণা করে তবে কী সর্বোত্তম উপায় হল ডিভাইসটি সনাক্ত করতে হার্ডওয়্যার স্ট্রিং ব্যবহার করা।

নতুন ডিভাইসের জন্য হার্ডওয়্যার স্ট্রিং নীচের মতো রয়েছে।

আইফোন 8 - আইফোন 10,1 বা আইফোন 10,4

আইফোন 8 প্লাস - আইফোন 10,2 বা আইফোন আইফোন 10,5

আইফোন এক্স - আইফোন 10,3 বা আইফোন 10,6


2
[UIDevice currentDevice]পরিবর্তে আপনার ব্যবহার করা উচিত[[UIDevice alloc] init]
এস ম্যাটসপুরা

হার্ডওয়্যার স্ট্রিংয়ের একমাত্র সমস্যা হ'ল এটি সিমুলেটারটিতে কাজ করে না
ক্রেমফুল

38

ডিভাইসের মডেল / মেশিনের নাম পরীক্ষা করে দেখুন , আপনার কোডে পয়েন্ট / পিক্সেল গণনাটি সরাসরি ব্যবহার করবেন না, এটি হার্ড কোড এবং ডিভাইস হার্ডওয়্যারের জন্য অর্থহীন, ডিভাইসের মডেলটি একধরণের ডিভাইসের সাথে ম্যাচ করার জন্য একমাত্র অনন্য সনাক্তকারী

#import <sys/utsname.h>

NSString* deviceName()
{
    struct utsname systemInfo;
    uname(&systemInfo);

    return [NSString stringWithCString:systemInfo.machine
                          encoding:NSUTF8StringEncoding];
}

ফলাফল:

@"iPhone10,3" on iPhone X (CDMA)
@"iPhone10,6" on iPhone X (GSM)

পড়ুন এই উত্তর

সম্পূর্ণ কোড বাস্তবায়ন:

#import <sys/utsname.h>

NSString * GetDeviceModel(void)
{
    static dispatch_once_t onceToken;
    static NSString *strModelID = nil;

    dispatch_once(&onceToken, ^{
#if TARGET_IPHONE_SIMULATOR
        strModelID = NSProcessInfo.processInfo.environment[@"SIMULATOR_MODEL_IDENTIFIER"];
#else
        struct utsname systemInfo;

        uname(&systemInfo);
        strModelID = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
#endif
    });

    return strModelID;
}

// See the `Hardware strings` in https://en.wikipedia.org/wiki/List_of_iOS_devices
BOOL IsiPhoneX(void)
{
    NSString *strModelID = GetDeviceModel();

    return [strModelID isEqualToString:@"iPhone10,3"] || [strModelID isEqualToString:@"iPhone10,6"];
}

BOOL IsNotchiPhone(void)
{
    NSArray<NSString *> *notchiModels = @[
        @"iPhone10,3", @"iPhone10,6", // iPhone X
        @"iPhone11,2", @"iPhone11,4", @"iPhone11,6", // iPhone XS (Max)
        @"iPhone11,8", // iPhone XR
        @"iPhone12,1", @"iPhone12,3", @"iPhone12,5", // iPhone 11 (Pro (Max))
    ];

    return [notchiModels containsObject:GetDeviceModel()];
}

1
সিমুলেটরটি সঠিকভাবে পরিচালনা করে বলে দুর্দান্ত উত্তর। দয়া করে "সম্পূর্ণ কোড" বিভাগে # ইমপোর্ট লাইন যুক্ত করুন। আমার প্রথম প্রয়াসে আমি এটি (অনুলিপি / আটকানো) মিস করেছি।
এমপিসোসট

1
এটি আমার পছন্দের পদ্ধতি। পড়ুন এই উইকি ডিভাইস মডেল স্ট্রিং একটি সম্পূর্ণ তালিকা জন্য। পার্শ্ব মন্তব্য হিসাবে, @ "আইফোন 10,3" এটিকে হার্ড কোড হিসাবে দেখা যেতে পারে।
YvesLeBorg

1
@ ইয়ভসলবার্গ হ্যাঁ, এটি সত্যিই একটি গুরুত্বপূর্ণ বিতর্কিত বিষয়। আমি মনে করি হার্ডওয়্যার মডেল স্ট্রিংয়ের ডিভাইসের স্ক্রিন পয়েন্টগুলির তুলনায় একটি অনন্য শনাক্তকারী রয়েছে। সাধারণত, এটি ডেটা পরিসংখ্যানগুলির জন্য ব্যবহৃত হয়।
Itachi

25
#define IS_IPHONE        (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define IS_IPHONE_4      (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 480.0)
#define IS_IPHONE_5      (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 568.0)
#define IS_IPHONE_6      (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 667.0)
#define IS_IPHONE_6PLUS  (IS_IPHONE && [[UIScreen mainScreen] nativeScale] == 3.0f)
#define IS_IPHONE_6_PLUS (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 736.0)
#define IS_IPHONE_X      (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 812.0)

IS_IPHONE_X সংজ্ঞায়িত করুন (IS_IPHONE &&& [[ইউআইস্ক্রিন মূলস্ক্রিন] সীমানা]। সাইজ.ইহাইট == 812.0)

#define IS_IPHONE_XS      (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 812.0)
#define IS_IPHONE_X_MAX      (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 896.0)
#define IS_RETINA        ([[UIScreen mainScreen] scale] >= 2.0) // 3.0 for iPhone X, 2.0 for others

#define IS_IPAD_DEVICE   [(NSString*)[UIDevice currentDevice].model hasPrefix:@"iPad"]

দ্রষ্টব্য: - সতর্কতা অবলম্বন করুন, এটি কেবল প্রতিকৃতি নির্দেশের জন্য সূক্ষ্মভাবে কাজ করে


2
সতর্কতা অবলম্বন করুন, এটি কেবল প্রতিকৃতি
নির্দেশের

1
এর জন্য ধন্যবাদ. ভাল কাজ করে. ল্যান্ডস্কেপ মোডে আপনাকে এই সংখ্যাগুলি সামঞ্জস্য করতে হবে। ল্যান্ডস্কেপ মোডে আইফোনএক্সের যাদু সংখ্যাটি 375.0
প্যাভেলা

কয়েকটি আইফোন প্লাস / ম্যাক্স / প্রো ব্যবহার nativeScaleকরছে 3.0, তাই না?
ইটাচি

24

সমস্ত উত্তরগুলি দেখার পরে আমি এটাই শেষ করেছি:

সমাধান (সুইফট 4.1 সামঞ্জস্যপূর্ণ)

extension UIDevice {
    static var isIphoneX: Bool {
        var modelIdentifier = ""
        if isSimulator {
            modelIdentifier = ProcessInfo.processInfo.environment["SIMULATOR_MODEL_IDENTIFIER"] ?? ""
        } else {
            var size = 0
            sysctlbyname("hw.machine", nil, &size, nil, 0)
            var machine = [CChar](repeating: 0, count: size)
            sysctlbyname("hw.machine", &machine, &size, nil, 0)
            modelIdentifier = String(cString: machine)
        }

        return modelIdentifier == "iPhone10,3" || modelIdentifier == "iPhone10,6"
    }

    static var isSimulator: Bool {
        return TARGET_OS_SIMULATOR != 0
    }
}

ব্যবহার

if UIDevice.isIphoneX {
    // is iPhoneX
} else {
    // is not iPhoneX
}

বিঃদ্রঃ

প্রাক সুইফট ৪.১ আপনি অ্যাপটি সিমুলেটারের মতো চলছে কিনা তা পরীক্ষা করতে পারেন:

TARGET_OS_SIMULATOR != 0

সুইফট ৪.১ এবং তারপরে আপনি টার্গেট এনভায়রনমেন্ট প্ল্যাটফর্ম শর্তটি ব্যবহার করে অ্যাপটি কোনও সিমুলেটরটিতে চলছে কিনা তা পরীক্ষা করতে পারবেন :

#if targetEnvironment(simulator)
    return true
#else
    return false
#endif

(পুরানো পদ্ধতিটি এখনও কাজ করবে তবে এই নতুন পদ্ধতিটি ভবিষ্যতের আরও প্রমাণ)


আপেল কি এই ভাল হবে?
সুরজিৎ রাজপুত

@ কমান্ডো 24 হ্যাঁ, এই কোডটির কারণে তাদের অ্যাপটি প্রত্যাখ্যান করার কোনও কারণ আমি দেখছি না।
ক্লাউড 9999 স্ট্রাইফ

18

মাত্রার উপর ভিত্তি করে এই সমস্ত উত্তর ভবিষ্যতের ডিভাইসগুলিতে ভুল আচরণের জন্য সংবেদনশীল। তারা আজ কাজ করবে, তবে পরের বছর যদি কোনও আইফোন থাকে তবে একই আকারের তবে ক্যামেরা ইত্যাদি থাকে গ্লাসের নীচে, যাতে কোনও "খাঁজ" নেই? যদি অ্যাপ্লিকেশনটি আপডেট করার একমাত্র বিকল্প হয় তবে তা আপনার এবং আপনার গ্রাহকদের পক্ষে একটি দুর্বল সমাধান।

আপনি "আইফোন 10,1" এর মতো হার্ডওয়্যার মডেল স্ট্রিংও পরীক্ষা করতে পারেন, তবে এটি সমস্যাযুক্ত কারণ কখনও কখনও অ্যাপল সারা বিশ্বের বিভিন্ন ক্যারিয়ারের জন্য বিভিন্ন মডেল নম্বর প্রকাশ করে।

সঠিক পন্থাটি হ'ল উপরের লেআউটটিকে নতুন করে ডিজাইন করা, বা কাস্টম নেভিগেশন বারের উচ্চতা (যা আমি ফোকাস করছিলাম) এর সাথে যে সমস্যাগুলি হচ্ছে তা সমাধান করা। তবে, আপনি যদি সেগুলির কোনওটি না করার সিদ্ধান্ত নেন তবে বুঝতে পারেন যে আপনি যা করছেন তা আজকে এই কাজটি করার জন্য একটি হ্যাক এবং আপনি কিছু সময় এটি সংশোধন করতে হবে, সম্ভবত একাধিকবার, হ্যাকগুলি রাখার জন্য কাজ।


1
ঠিক। একটি অনুমানকে সংশোধন করা হচ্ছে যে এক্স নম্বর সর্বদা একটি থেকে এক হবে যে এক্স এক্স সর্বদা একটি হবে শর্তযুক্ত Y না হওয়া সত্ত্বেও যখন বি হবে তখনই আরও গভীর খনন করা হবে। অ্যাপল-মনোনীত নিরাপদ অঞ্চলের উপর ভিত্তি করে আকার, এটি দ্বিতীয়-অনুমান করে নয়।
টমি

2
আমি যখন পরবর্তী আইফোনটি আসবে তখন তা নিয়ে উদ্বিগ্ন হব। আমি আজই আমার অ্যাপ্লিকেশনটি কাজ করতে চাই।
ওয়াহিদ আমিরি

13

সুইট 4+ উত্তর

আইফোন এক্স, এক্সআর, এক্সএস, এক্সএসম্যাক্স, ১১ প্রো, ১১ প্রো সর্বোচ্চ:

দ্রষ্টব্য: পরীক্ষার জন্য সত্যিকারের ডিভাইস দরকার

উল্লেখ

 let deviceType = UIDevice.current.modelName
        switch deviceType {
        case "iPhone10,3", "iPhone10,6":
            print("iPhoneX")
        case "iPhone11,2":
            print("iPhone XS")
        case "iPhone11,4":
            print("iPhone XS Max")
        case "iPhone11,6":
            print("iPhone XS Max China")
        case "iPhone11,8":
            print("iPhone XR")
        case "iPhone12,3":
            print("iPhone 11 Pro")
        case "iPhone12,5":
            print("iPhone 11 Pro Max")
        default:
            break
}

extension UIDevice {
    var modelName: String {
        var systemInfo = utsname()
        uname(&systemInfo)
        let machineMirror = Mirror(reflecting: systemInfo.machine)
        let identifier = machineMirror.children.reduce("") { identifier, element in
            guard let value = element.value as? Int8, value != 0 else { return identifier }
            return identifier + String(UnicodeScalar(UInt8(value)))
        }
        return identifier
    }
}

পদ্ধতি 1 এর জন্য, আপনি ফানকের বাইরে "বার উইন্ডো" বৈশিষ্ট্য এবং এর মধ্যে কেবল "লেট" ধ্রুবকটি (UIWindow টাইপ করুন, অর্থাৎ optionচ্ছিক নয়) কেড়ে নিতে পারেন। আমি এই উত্তরটি প্রারম্ভকালেই পছন্দ করি, সেল্ফ.ভিউ.উইনডো শূন্য হতে পারে, এবং ইউআইএপ্লিকেশন.শ্রেড.কি উইন্ডো একইভাবে শূন্য হতে পারে, তবে এইভাবে একটি ইউআই উইন্ডো তৈরি করা প্রতিবার কাজ করে।
রোলেরিক

11

আইফোন 11 সমর্থন সহ সুইট 4/5 পুনরায় ব্যবহারযোগ্য এক্সটেনশন

    public extension UIDevice {

    public enum `Type` {
        case iPad
        case iPhone_unknown
        case iPhone_5_5S_5C
        case iPhone_6_6S_7_8
        case iPhone_6_6S_7_8_PLUS
        case iPhone_X_Xs
        case iPhone_Xs_11_Pro_Max
        case iPhone_Xr_11
        case iPhone_11_Pro
    }

    public var hasHomeButton: Bool {
        switch type {
        case .iPhone_X_Xs, .iPhone_Xr_11, .iPhone_Xs_11_Pro_Max, .iPhone_11_Pro:
            return false
        default:
            return true
        }
    }

    public var type: Type {
        if userInterfaceIdiom == .phone {
            switch UIScreen.main.nativeBounds.height {
            case 1136: return .iPhone_5_5S_5C
            case 1334: return .iPhone_6_6S_7_8
            case 1920, 2208: return .iPhone_6_6S_7_8_PLUS
            case 2436: return .iPhone_X_Xs
            case 2688: return .iPhone_Xs_11_Pro_Max
            case 1792: return .iPhone_Xr_11
            case 2426: return .iPhone_11_Pro
            default: return .iPhone_unknown
        }
        }
        return .iPad
   }
}

2
ভাল এক্সটেনশন, তবে বেশিরভাগ দরকারী এখানেUIDevice.current.hasHomeButton
WINSergey

1
@ale_stro সর্বজনীন অ্যাপ্লিকেশনটির জন্য ডিভাইসগুলি নির্ধারণের জন্য userInterfaceIdiom ব্যবহার করা কি ভাল? বেশিরভাগ লোক এটি সুপারিশ করে না। এটি ব্যবহার করার কি কোনও ক্ষতি আছে?
শাকির

10

হ্যা এটা সম্ভব. ডাউনলোড করুনইউআইডিভাইস-হার্ডওয়্যার এক্সটেনশানটি (বা কোকোপড 'ইউআইডিভাইস-হার্ডওয়্যার'-এর মাধ্যমে ইনস্টল করুন) এবং তারপরে ব্যবহার করুন:

NSString* modelID = [[[UIDevice currentDevice] modelIdentifier];
BOOL isIphoneX = [modelID isEqualToString:@"iPhone10,3"] || [modelID isEqualToString:@"iPhone10,6"];

মনে রাখবেন যে এটি কেবল আসল ডিভাইসে সিমুলেটারে কাজ করবে না।


এখানে সমস্ত ডিভাইস কোড: iphonesoft.fr/2016/10/31/… উদাহরণ: আইফোন এক্স: আইফোন 10,5 এবং আইফোন 10,6
মেধী

হার্ডওয়্যারের স্ট্রিং থেকে উইকিপিডিয়া "iPhone10,3 এবং iPhone10,6" বলেন। @Medhi
Itachi

@ মেধী, আপনি এক্সকোড ProcessInfo.processInfo.environment["SIMULATOR_MODEL_IDENTIF‌​IER"]থেকে আসল মান পেতে সিমুলেটর ব্যবহার করতে পারেন ।
Cœur

9

@ সাসওয়ানের প্রতিক্রিয়া অনুসারে এটি একটি সুইফট 4 সংস্করণ:

var iphoneX = false
if #available(iOS 11.0, *) {
    if ((UIApplication.shared.keyWindow?.safeAreaInsets.top)! > CGFloat(0.0)) {
        iphoneX = true
    }
}

স্ট্যাটাস বারটিও নিরাপদ এলাকার বাইরে বিবেচিত! সুতরাং এটি মিথ্যা ইতিবাচক প্রত্যাবর্তন করবে! এটি 20 পয়েন্টের পরে (স্ট্যাটাসবারের উচ্চতা) বেশি হওয়া উচিত। ডিভাইসটি আইফোন এক্স, আর বা এক্সএস সর্বোচ্চ হলে এটিও সত্য ফিরে আসে true
এমকিউডার

কোড কাজ করে মহান, কিন্তু সতর্কতা অবলম্বন করা আবশ্যক: keyWindowহয় nilনা হওয়া পর্যন্ত প্রধান দৃশ্য নিয়ামক ডেকেছেনviewDidAppear
ক্যাসি

9

আমি জানি এটি কেবল একটি সুইফট সমাধান, তবে এটি কাউকে সহায়তা করতে পারে।

আমার globals.swiftপ্রতিটি প্রকল্পে এবং আমি সর্বদা যুক্ত করা একটির DeviceTypeমধ্যে ব্যবহারকারীর ডিভাইসটি সহজেই সনাক্ত করা যায়:

struct ScreenSize {
  static let width = UIScreen.main.bounds.size.width
  static let height = UIScreen.main.bounds.size.height
  static let frame = CGRect(x: 0, y: 0, width: ScreenSize.width, height: ScreenSize.height)
  static let maxWH = max(ScreenSize.width, ScreenSize.height)
}

struct DeviceType {
  static let iPhone4orLess = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.maxWH < 568.0
  static let iPhone5orSE   = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.maxWH == 568.0
  static let iPhone678     = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.maxWH == 667.0
  static let iPhone678p    = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.maxWH == 736.0
  static let iPhoneX       = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.maxWH == 812.0
  static let iPhoneXRMax   = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.maxWH == 896.0
  static var hasNotch: Bool {
    return iPhoneX || iPhoneXRMax
  }
}

তারপরে এটি ব্যবহার করতে:

if DeviceType.hasNotch {
  print("This executes on all phones with a notch")
}

if DeviceType.iPhone678 {
  print("This executes on iPhones 6, 7 and 8")
}

আপনি যদি LaunchImageআপনার প্রকল্পে ব্যবহার করেন তবে সমস্ত সমর্থিত ডিভাইসগুলির জন্য চিত্রগুলি যুক্ত করার বিষয়টি নিশ্চিত করুন (যেমন এক্সএস ম্যাক্স, এক্সআর) কারণ UIScreen.main.boundsসেগুলি ছাড়া সঠিক মান ফিরে আসবে না।


1
নতুন সুইফটে থাকা বন্ধুটি কীভাবে এটি ব্যবহার করবেন জানতে চাইলে, অন্য কেউ না জানলে… if DeviceType.iPhoneX { //do something for iPhone X notch }else{ // don’t do anything about notch }
লিয়াম বোলিং

5

সমস্ত উত্তর যা ব্যবহার করছে heightতা হ'ল একটি কারণে গল্পের অর্ধেক অংশ। আপনি যদি ডিভাইস অরিয়েন্টেশন landscapeLeftবা landscapeRightচেকটি ব্যর্থ হয় যখন এটির মতো চেক করতে চলেছেন , কারণ heightthewidth

এই কারণেই আমার সমাধানটি সুইফট ৪.০-তে এইরকম দেখাচ্ছে:

extension UIScreen {
    ///
    static var isPhoneX: Bool {
        let screenSize = UIScreen.main.bounds.size
        let width = screenSize.width
        let height = screenSize.height
        return min(width, height) == 375 && max(width, height) == 812
    }
}

পরিবর্তে নেটিববাউন্ডগুলি ব্যবহার করুন
লিও ডাবাস

4

আপনার ধরে নেওয়া উচিত নয় যে অ্যাপলটি আলাদা ইউআইএনএভিগেশনবার উচ্চতার সাথে একমাত্র ডিভাইস প্রকাশ করে তা হ'ল আইফোন এক্স a ​​আরও জেনেরিক সমাধান ব্যবহার করে এই সমস্যাটি সমাধান করার চেষ্টা করুন। আপনি যদি চান যে দন্ডটি সর্বদা তার ডিফল্ট উচ্চতার চেয়ে 20px বড় হয় তবে আপনার কোডটি বারটিকে 40px (44px + 20px) এ সেট করার পরিবর্তে বারের উচ্চতায় 20px যুক্ত করা উচিত।


সুতরাং, আপনার আর কী সমাধান প্রস্তাব করা উচিত?
স্টিফেন ম্যাথিস

@ এক্সফোড এখন আরও ভাল উত্তর আছে।
সিউর

4
struct ScreenSize {
    static let width = UIScreen.main.bounds.size.width
    static let height = UIScreen.main.bounds.size.height
    static let maxLength = max(ScreenSize.width, ScreenSize.height)
    static let minLength = min(ScreenSize.width, ScreenSize.height)
    static let frame = CGRect(x: 0, y: 0, width: ScreenSize.width, height: ScreenSize.height)
}

struct DeviceType {
    static let iPhone4orLess = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.maxLength < 568.0
    static let iPhone5orSE = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.maxLength == 568.0
    static let iPhone678 = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.maxLength == 667.0
    static let iPhone678p = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.maxLength == 736.0
    static let iPhoneX = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.maxLength == 812.0

    static let IS_IPAD              = UIDevice.current.userInterfaceIdiom == .pad && ScreenSize.maxLength == 1024.0
    static let IS_IPAD_PRO          = UIDevice.current.userInterfaceIdiom == .pad && ScreenSize.maxLength == 1366.0
}

4

সুইফট 3 + 4:

কোনও ডিভাইসের আকার পিক্সেল মান ছাড়াই

//UIApplication+SafeArea.swift

extension UIApplication { 

    static var isDeviceWithSafeArea:Bool {

        if #available(iOS 11.0, *) {
            if let topPadding = shared.keyWindow?.safeAreaInsets.bottom,
                topPadding > 0 {
                return true
            }
        }

        return false
    }
}

উদাহরণ:

if UIApplication.isDeviceWithSafeArea {
     //e.g. change the frame size height of your UITabBar
}

3
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define IS_IPHONE_X (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 812.0f)

2
আপনার 812 আসতে হবে যদি আপনি সেই তখন পর্যন্ত আইফোন এক্স জন্য ছবিটি ডিফল্ট আপলোড আমার মনে হয় এটা আপনি আইফোন 7 আকার ফিরে আসবে না নিশ্চিত যদিও ...
ফাহিম Parkar

3
- (BOOL)isIphoneX {
    if (@available(iOS 11.0, *)) {
        UIWindow *window = UIApplication.sharedApplication.keyWindow;
        CGFloat topPadding = window.safeAreaInsets.top;
        if(topPadding>0) {
            return YES;
        }
        else {
            return NO;
        }
    }
    else {
        return NO;
    }
}

1
সর্বোত্তম উত্তর! কোনও ডিভাইসের আকার পিক্সেল মান ছাড়াই।
পিটার ক্রেইঞ্জ

3

সাধারণত, উপরে বা নীচে সীমাবদ্ধ করার জন্য প্রোগ্রামারটির এটির প্রয়োজন হয়, সুতরাং এই পদ্ধতিগুলি সহায়তা করতে পারে

static func extraTop() -> CGFloat {

    var top: CGFloat = 0

    if #available(iOS 11.0, *) {

        if let t = UIApplication.shared.keyWindow?.safeAreaInsets.top {
            top = t
        }
    }
    return top
}

static func extraBottom() -> CGFloat {

    var bottom: CGFloat = 0

    if #available(iOS 11.0, *) {

        if let b = UIApplication.shared.keyWindow?.safeAreaInsets.bottom {
            bottom = b
        }
    }
    return bottom
}

আইফোন এক্সের আগে এই পদ্ধতিগুলি ফিরে আসবে: 0

আইফোন এক্সের জন্য: 44 এবং 34 সেই অনুযায়ী

তারপরে এই অতিরিক্তগুলি কেবল শীর্ষ বা নীচের সীমাবদ্ধতায় যুক্ত করুন


3

নেটিভ সীমানা উচ্চতার (আমার মতো) জন্য 2436px এর পরিবর্তে 2001px প্রাপ্তদের ক্ষেত্রে, এটি কারণ আপনি iOS 11 এর আগে (Xcode 9 এর পরিবর্তে Xcode 8) পুরানো এসডিকে দিয়ে আপনার অ্যাপ্লিকেশনটি তৈরি করেছিলেন। পুরানো এসডিকে দিয়ে, আইওএস শীর্ষ "সেন্সর নচ" ছাড়িয়ে আইফোন এক্স-এ অ্যাপ্লিকেশনগুলি "ব্ল্যাক বক্সড" প্রদর্শন করবে instead এটি স্ক্রিনের আকার হ্রাস করে যার কারণে সেই সম্পত্তি 2436 এর পরিবর্তে 2001 ফিরিয়ে দেয়।

সবচেয়ে সহজ সমাধানটি হ'ল যদি আপনি কেবল ডিভাইস সনাক্তকরণে আগ্রহী হন তবে উভয় আকারের জন্য পরীক্ষা করা। আমি পুরানো এক্সকোড এসডিকে দিয়ে তৈরি করার সময় ফেসআইডি সনাক্ত করার জন্য এই পদ্ধতিটি ব্যবহার করেছি যার বায়োমেট্রিক ধরণের নির্দিষ্টকরণের ENUM মান নেই। এই পরিস্থিতিতে, স্ক্রিনের উচ্চতা ব্যবহার করে ডিভাইস সনাক্তকরণটি Xcode আপডেট না করে ডিভাইসটির ফেসআইড বনাম টাচআইডি আছে কিনা তা জানার সেরা উপায় বলে মনে হয়েছিল।


3

অন্যান্য সমাধানগুলির পরামর্শ অনুসারে স্ক্রিন পিক্সেল আকার ব্যবহার করবেন না, এটি খারাপ কারণ এটি ভবিষ্যতের ডিভাইসের জন্য মিথ্যা ধনাত্মক হতে পারে; UIWindow এখনও রেন্ডার না করলে (অ্যাপডেলিগেট) কাজ করবে না, ল্যান্ডস্কেপ অ্যাপ্লিকেশনগুলিতে কাজ করবে না এবং স্কেল সেট করা থাকলে সিমুলেটারে ব্যর্থ হতে পারে।

পরিবর্তে, আমি এই উদ্দেশ্যে একটি ম্যাক্রো তৈরি করেছি, এটি ব্যবহার করা খুব সহজ এবং উল্লিখিত সমস্যাগুলি রোধ করতে হার্ডওয়্যার পতাকাগুলির উপর নির্ভর করে।

সম্পাদনা: আইফোনএক্স, আইফোন এক্সএস, আইফোন এক্সআর, আইফোনএক্সএস সর্বোচ্চ সমর্থন করার জন্য আপডেট হয়েছে


ব্যবহার করা:

if (IS_DEVICE_IPHONEX) {
    //do stuff
}

হ্যাঁ, সত্যিই।


ম্যাক্রো:

কেবল এটিকে যে কোনও জায়গায় পেস্ট করুন, আমি আমার .h ফাইলের পরে খুব নীচে পছন্দ করি @end

#import <sys/utsname.h>

#if TARGET_IPHONE_SIMULATOR
#define IS_SIMULATOR YES
#else
#define IS_SIMULATOR NO
#endif

#define IS_DEVICE_IPHONEX (\
(^BOOL (void){\
NSString *__modelIdentifier;\
if (IS_SIMULATOR) {\
__modelIdentifier = NSProcessInfo.processInfo.environment[@"SIMULATOR_MODEL_IDENTIFIER"];\
} else {\
struct utsname __systemInfo;\
uname(&__systemInfo);\
__modelIdentifier = [NSString stringWithCString:__systemInfo.machine encoding:NSUTF8StringEncoding];\
}\
NSString *__iPhoneX_GSM_Identifier = @"iPhone10,6";\
NSString *__iPhoneX_CDMA_Identifier = @"iPhone10,3";\
NSString *__iPhoneXR_Identifier = @"iPhone11,8";\
NSString *__iPhoneXS_Identifier = @"iPhone11,2";\
NSString *__iPhoneXSMax_China_Identifier = @"iPhone11,6";\
NSString *__iPhoneXSMax_Other_Identifier = @"iPhone11,4";\
return ([__modelIdentifier isEqualToString:__iPhoneX_GSM_Identifier] || [__modelIdentifier isEqualToString:__iPhoneX_CDMA_Identifier] || [__modelIdentifier isEqualToString:__iPhoneXR_Identifier] || [__modelIdentifier isEqualToString:__iPhoneXS_Identifier] || [__modelIdentifier isEqualToString:__iPhoneXSMax_China_Identifier] || [__modelIdentifier isEqualToString:__iPhoneXSMax_Other_Identifier]);\
})()\
)

আইফোনএক্স সনাক্ত করার জন্য আমি কেবলমাত্র কারণটি ভাবতে পারি হ'ল পর্দার শীর্ষে খাঁজ এড়ানো; যদি তাই হয় তবে আপনি খাঁজ মাপের আকারটি সনাক্ত করতে SafeArea.top পরীক্ষা করতে পারেন। ইউআইওয়াইন্ডো লোড হওয়ার পরে আপনি এটি পরিমাপ করেছেন তা নিশ্চিত করুন, তাই ভিডডিডোড চলাকালীন নয় তবে একটি থ্রেড-সাইকেল পরে:if (@available(iOS 11.0, *)) { [UIApplication sharedApplication].keyWindow.safeAreaInsets.top }
আলবার্ট রেনশো

2

আমি অন্যের উত্তরগুলি আপনার সম্পর্কে বিশদভাবে বর্ণনা করেছি এবং ইউআইডিভাইসিতে দ্রুত প্রসারিত করেছি। আমি দ্রুত এনামস এবং "ক্রমযুক্ত সবকিছু" এবং পরমাণু পছন্দ করি। আমি এমন সমাধান তৈরি করেছি যা ডিভাইস এবং সিমুলেটর উভয় ক্ষেত্রেই কার্যকর হয়।

সুবিধা: - সাধারণ ইন্টারফেস, ব্যবহার যেমন UIDevice.current.isIPhoneX -UIDeviceModelType এনাম আপনাকে সহজেই মডেল নির্দিষ্ট বৈশিষ্ট্যগুলি এবং আপনার অ্যাপ্লিকেশনটিতে ব্যবহার করতে চান এমন ধ্রুবকগুলি প্রসারিত করার ক্ষমতা দেয়, যেমন কর্নার রেডিও

অসুবিধা: - এটি মডেল নির্দিষ্ট সমাধান, রেজোলিউশন সুনির্দিষ্ট নয় - উদাহরণস্বরূপ যদি অ্যাপল একই চশমা সহ অন্য একটি মডেল তৈরি করে, এটি সঠিকভাবে কাজ করবে না এবং এই কাজটি করার জন্য আপনাকে অন্য মডেল যুক্ত করতে হবে => আপনাকে নিজের আপডেট করতে হবে অ্যাপ্লিকেশান।

extension UIDevice {

    enum UIDeviceModelType : Equatable {

        ///iPhoneX
        case iPhoneX

        ///Other models
        case other(model: String)

        static func type(from model: String) -> UIDeviceModelType {
            switch model {
            case "iPhone10,3", "iPhone10,6":
                return .iPhoneX
            default:
                return .other(model: model)
            }
        }

        static func ==(lhs: UIDeviceModelType, rhs: UIDeviceModelType) -> Bool {
            switch (lhs, rhs) {
            case (.iPhoneX, .iPhoneX):
                return true
            case (.other(let modelOne), .other(let modelTwo)):
                return modelOne == modelTwo
            default:
                return false
            }
        }
    }

    var simulatorModel: String? {
        guard TARGET_OS_SIMULATOR != 0 else {
            return nil
        }

        return ProcessInfo.processInfo.environment["SIMULATOR_MODEL_IDENTIFIER"]
    }

    var hardwareModel: String {
        var systemInfo = utsname()
        uname(&systemInfo)
        let machineMirror = Mirror(reflecting: systemInfo.machine)
        let model = machineMirror.children.reduce("") { identifier, element in
            guard let value = element.value as? Int8, value != 0 else { return identifier }
            return identifier + String(UnicodeScalar(UInt8(value)))
        }

        return model
    }

    var modelType: UIDeviceModelType {
        let model = self.simulatorModel ?? self.hardwareModel
        return UIDeviceModelType.type(from: model)
    }

    var isIPhoneX: Bool {
        return modelType == .iPhoneX
    }
}

ব্যবহারের পরিবর্তে, ক্লাউড 9999 স্ট্রিফ উত্তরে (এবং আমার উত্তরেও) এর মতো Mirrorব্যবহার করা আরও দ্রুত হবে sysctlbyname
সিউর

2

আমি এটি আইফোন এক্স কিনা তা সনাক্ত করতে স্ট্যাটাস বার ফ্রেমের উচ্চতার উপর নির্ভর করি:

if UIApplication.shared.statusBarFrame.height >= CGFloat(44) {
    // It is an iPhone X
}

এটি অ্যাপ্লিকেশন আন প্রতিকৃতির জন্য। আপনি ডিভাইস ওরিয়েন্টেশন অনুসারে আকারটিও পরীক্ষা করতে পারেন। এছাড়াও, অন্যান্য আইফোনে, স্ট্যাটাস বারটি লুকিয়ে থাকতে পারে, তাই ফ্রেমের উচ্চতা 0। আইফোন এক্স-এ, স্ট্যাটাস বারটি কখনও লুকানো থাকে না।


আপনি এটি সহ আইফোনএক্সের স্ট্যাটাস বারটি আড়াল করতে পারেন controller: - (BOOL)prefersStatusBarHidden { return YES; } তারপরে স্ট্যাটাস বারের উচ্চতা 0
夜 夜 之 星辰

@ 无 夜 之 星辰 আমি অ্যাপ্লিকেশনটিতে বুট করার সময় এটি পরীক্ষা করে দেখি।
টায়োইস

2

আমি পিটার ক্রেইঞ্জের কোডটি ব্যবহার করছিলাম (কারণ এটি পরিষ্কার ছিল এবং আমার যা প্রয়োজন ছিল তা করেছিলাম) তবে আমি বুঝতে পেরেছিলাম এটি ঠিক তখনই কাজ করে যখন ডিভাইস প্রতিকৃতিতে থাকে (যেহেতু শীর্ষ প্যাডিং শীর্ষে থাকবে, স্পষ্টতই) তাই আমি সমস্ত এক্সপ্লোর পরিচালনা করার জন্য একটি এক্সটেনশন তৈরি করেছি স্ক্রিনের আকারে রিলে না করেই তার সম্পর্কিত প্যাডিংগুলির সাথে স্থিতিবিন্যাস:

extension UIDevice {

    var isIphoneX: Bool {
        if #available(iOS 11.0, *), isIphone {
            if isLandscape {
                if let leftPadding = UIApplication.shared.keyWindow?.safeAreaInsets.left, leftPadding > 0 {
                    return true
                }
                if let rightPadding = UIApplication.shared.keyWindow?.safeAreaInsets.right, rightPadding > 0 {
                    return true
                }
            } else {
                if let topPadding = UIApplication.shared.keyWindow?.safeAreaInsets.top, topPadding > 0 {
                    return true
                }
                if let bottomPadding = UIApplication.shared.keyWindow?.safeAreaInsets.bottom, bottomPadding > 0 {
                    return true
                }
            }
        }
        return false
    }

    var isLandscape: Bool {
        return UIDeviceOrientationIsLandscape(orientation) || UIInterfaceOrientationIsLandscape(UIApplication.shared.statusBarOrientation)
    }

    var isPortrait: Bool {
        return UIDeviceOrientationIsPortrait(orientation) || UIInterfaceOrientationIsPortrait(UIApplication.shared.statusBarOrientation)
    }

    var isIphone: Bool {
        return self.userInterfaceIdiom == .phone
    }

    var isIpad: Bool {
        return self.userInterfaceIdiom == .pad
    }
}

এবং আপনার কল সাইটে আপনি ঠিক:

let res = UIDevice.current.isIphoneX

2

বিকল্পভাবে, আপনি ' ডিভাইসকিট ' পড পরীক্ষা করতে পারেন । একবার ইনস্টল হয়ে গেলে, ডিভাইসটি পরীক্ষা করতে আপনাকে যা করতে হবে তা হ'ল:

import DeviceKit
let device = Device()
if device == .iPhoneX {
  // place your code here
}

2

নভেম্বর 2019:

আমি আমার সমস্ত প্রযোজনা প্রকল্পে যা ব্যবহার করি তা এখানে। মনে রাখবেন এই টুকরোটি বেশ দীর্ঘ is

  1. এটি প্রস্থ বা উচ্চতার গণনা ব্যবহার করে না, বরং:
  2. এটি ডিভাইসের স্ট্রিং মডেলটি পরীক্ষা করে।
  3. কোনও প্রাইভেট / অননুমোদিত API ব্যবহার করার কারণে অ্যাপল দ্বারা আপনার বিল্ড প্রত্যাখ্যান করার ঝুঁকি নেই।
  4. সিমুলেটরগুলির সাথে কাজ করে 💯

    import UIKit
    
    class DeviceUtility {
        /// Determines if the current device of the user is an iPhoneX type/variant.
        static var isIphoneXType: Bool {
            get {
                switch UIDevice().type {
                case .iPhoneXR, .iPhoneXS, .iPhoneXSMax, .iPhoneX, .iPhone11, .iPhone11Pro, .iPhone11ProMax: return true
                default: return false
                }
            }
        }
    }
    
    
    public enum DeviceModel : String {
        case simulator     = "simulator/sandbox",
    
        // MARK: - iPods
    
        iPod1              = "iPod 1",
        iPod2              = "iPod 2",
        iPod3              = "iPod 3",
        iPod4              = "iPod 4",
        iPod5              = "iPod 5",
    
        // MARK: - iPads
    
        iPad2              = "iPad 2",
        iPad3              = "iPad 3",
        iPad4              = "iPad 4",
        iPadAir            = "iPad Air ",
        iPadAir2           = "iPad Air 2",
        iPad5              = "iPad 5", //aka iPad 2017
        iPad6              = "iPad 6", //aka iPad 2018
    
        // MARK: - iPad Minis
    
        iPadMini           = "iPad Mini",
        iPadMini2          = "iPad Mini 2",
        iPadMini3          = "iPad Mini 3",
        iPadMini4          = "iPad Mini 4",
    
        // MARK: - iPad Pros
    
        iPadPro9_7         = "iPad Pro 9.7\"",
        iPadPro10_5        = "iPad Pro 10.5\"",
        iPadPro12_9        = "iPad Pro 12.9\"",
        iPadPro2_12_9      = "iPad Pro 2 12.9\"",
    
        // MARK: - iPhones
    
        iPhone4            = "iPhone 4",
        iPhone4S           = "iPhone 4S",
        iPhone5            = "iPhone 5",
        iPhone5S           = "iPhone 5S",
        iPhone5C           = "iPhone 5C",
        iPhone6            = "iPhone 6",
        iPhone6plus        = "iPhone 6 Plus",
        iPhone6S           = "iPhone 6S",
        iPhone6Splus       = "iPhone 6S Plus",
        iPhoneSE           = "iPhone SE",
        iPhone7            = "iPhone 7",
        iPhone7plus        = "iPhone 7 Plus",
        iPhone8            = "iPhone 8",
        iPhone8plus        = "iPhone 8 Plus",
        iPhoneX            = "iPhone X",
        iPhoneXS           = "iPhone XS",
        iPhoneXSMax        = "iPhone XS Max",
        iPhoneXR           = "iPhone XR",
        iPhone11           = "iPhone 11",
        iPhone11Pro        = "iPhone 11 Pro",
        iPhone11ProMax     = "iPhone 11 Pro Max",
    
        // MARK: - Apple TVs
    
        AppleTV            = "Apple TV",
        AppleTV_4K         = "Apple TV 4K",
    
        // MARK: - Unrecognized
    
        unrecognized       = "?unrecognized?"
    }
    
    // #-#-#-#-#-#-#-#-#-#-#-#-#-#-#
    //MARK: UIDevice extensions
    // #-#-#-#-#-#-#-#-#-#-#-#-#-#-#
    
    public extension UIDevice {
        var type: DeviceModel {
            var systemInfo = utsname()
            uname(&systemInfo)
            let modelCode = withUnsafePointer(to: &systemInfo.machine) {
                $0.withMemoryRebound(to: CChar.self, capacity: 1) {
                    ptr in String.init(validatingUTF8: ptr)
    
                }
            }
            let modelMap : [ String : DeviceModel ] = [
    
                // MARK: - Simulators
    
                "i386"      : .simulator,
                "x86_64"    : .simulator,
    
                // MARK: - iPod
    
                "iPod1,1"   : .iPod1,
                "iPod2,1"   : .iPod2,
                "iPod3,1"   : .iPod3,
                "iPod4,1"   : .iPod4,
                "iPod5,1"   : .iPod5,
    
                // MARK: - iPad
    
                "iPad2,1"   : .iPad2,
                "iPad2,2"   : .iPad2,
                "iPad2,3"   : .iPad2,
                "iPad2,4"   : .iPad2,
                "iPad3,1"   : .iPad3,
                "iPad3,2"   : .iPad3,
                "iPad3,3"   : .iPad3,
                "iPad3,4"   : .iPad4,
                "iPad3,5"   : .iPad4,
                "iPad3,6"   : .iPad4,
                "iPad4,1"   : .iPadAir,
                "iPad4,2"   : .iPadAir,
                "iPad4,3"   : .iPadAir,
                "iPad5,3"   : .iPadAir2,
                "iPad5,4"   : .iPadAir2,
                "iPad6,11"  : .iPad5, //aka iPad 2017
                "iPad6,12"  : .iPad5,
                "iPad7,5"   : .iPad6, //aka iPad 2018
                "iPad7,6"   : .iPad6,
    
                // MARK: - iPad mini
    
                "iPad2,5"   : .iPadMini,
                "iPad2,6"   : .iPadMini,
                "iPad2,7"   : .iPadMini,
                "iPad4,4"   : .iPadMini2,
                "iPad4,5"   : .iPadMini2,
                "iPad4,6"   : .iPadMini2,
                "iPad4,7"   : .iPadMini3,
                "iPad4,8"   : .iPadMini3,
                "iPad4,9"   : .iPadMini3,
                "iPad5,1"   : .iPadMini4,
                "iPad5,2"   : .iPadMini4,
    
                // MARK: - iPad pro
    
                "iPad6,3"   : .iPadPro9_7,
                "iPad6,4"   : .iPadPro9_7,
                "iPad7,3"   : .iPadPro10_5,
                "iPad7,4"   : .iPadPro10_5,
                "iPad6,7"   : .iPadPro12_9,
                "iPad6,8"   : .iPadPro12_9,
                "iPad7,1"   : .iPadPro2_12_9,
                "iPad7,2"   : .iPadPro2_12_9,
    
                // MARK: - iPhone
    
                "iPhone3,1" : .iPhone4,
                "iPhone3,2" : .iPhone4,
                "iPhone3,3" : .iPhone4,
                "iPhone4,1" : .iPhone4S,
                "iPhone5,1" : .iPhone5,
                "iPhone5,2" : .iPhone5,
                "iPhone5,3" : .iPhone5C,
                "iPhone5,4" : .iPhone5C,
                "iPhone6,1" : .iPhone5S,
                "iPhone6,2" : .iPhone5S,
                "iPhone7,1" : .iPhone6plus,
                "iPhone7,2" : .iPhone6,
                "iPhone8,1" : .iPhone6S,
                "iPhone8,2" : .iPhone6Splus,
                "iPhone8,4" : .iPhoneSE,
                "iPhone9,1" : .iPhone7,
                "iPhone9,3" : .iPhone7,
                "iPhone9,2" : .iPhone7plus,
                "iPhone9,4" : .iPhone7plus,
                "iPhone10,1" : .iPhone8,
                "iPhone10,4" : .iPhone8,
                "iPhone10,2" : .iPhone8plus,
                "iPhone10,5" : .iPhone8plus,
                "iPhone10,3" : .iPhoneX,
                "iPhone10,6" : .iPhoneX,
                "iPhone11,2" : .iPhoneXS,
                "iPhone11,4" : .iPhoneXSMax,
                "iPhone11,6" : .iPhoneXSMax,
                "iPhone11,8" : .iPhoneXR,
                "iPhone12,1" : .iPhone11,
                "iPhone12,3" : .iPhone11Pro,
                "iPhone12,5" : .iPhone11ProMax,
    
                // MARK: - AppleTV
    
                "AppleTV5,3" : .AppleTV,
                "AppleTV6,2" : .AppleTV_4K
            ]
    
            if let model = modelMap[String.init(validatingUTF8: modelCode!)!] {
                if model == .simulator {
                    if let simModelCode = ProcessInfo().environment["SIMULATOR_MODEL_IDENTIFIER"] {
                        if let simModel = modelMap[String.init(validatingUTF8: simModelCode)!] {
                            return simModel
                        }
                    }
                }
                return model
            }
            return DeviceModel.unrecognized
        }
    }

ব্যবহার: ইনসেটটি যাক: সিজিফ্লোট = ডিভাইস ইউটিলিটি.আইস আইফোনএক্সটাইপ? 50.0: 40.0


পুরোপুরি কাজ করে। ধন্যবাদ। আমি এটি একটি সুইফটুআই প্রকল্পে ব্যবহার করছি।
লন্ডনগুই

1

আমাকে সম্প্রতি একই সমস্যাটি সমাধান করতে হয়েছিল। এবং এই প্রশ্নের যথাযথভাবে উত্তর দেওয়া হলেও ("না"), এটি আইফোন এক্সের নির্দিষ্ট লেআউট আচরণের প্রয়োজন এমন অন্যদের সহায়তা করতে পারে।

ডিভাইসটি আইফোন এক্স কিনা সে বিষয়ে আমি সত্যিই আগ্রহী ছিলাম না the ডিভাইসটির খাঁজ প্রদর্শন ছিল কিনা তা নিয়ে আমি আগ্রহী।

private static var hasNotchedDisplay: Bool {
    if let window = UIApplication.shared.keyWindow {
        return (window.compatibleSafeAreaInsets.top > 20.0 || window.compatibleSafeAreaInsets.left > 0.0 || window.compatibleSafeAreaInsets.right > 0.0)
    }

    return false
}

আপনি hasOnScreenHomeIndicatorএকই লাইন বরাবর একটি ভেরিয়েবল লিখতেও পারেন (যদিও নীচের নিরাপদ অঞ্চলটি পরীক্ষা করুন, সম্ভবত?)।

UIViewউপরেরগুলিতে আইওএস 10 এবং তারও আগের সুরক্ষিত অঞ্চল ইনসেটগুলিতে সুবিধাজনক অ্যাক্সেসের জন্য আমার এক্সটেনশনটি ব্যবহার করে।

@objc public extension UIView {
    @objc public var compatibleSafeAreaInsets: UIEdgeInsets {
        if #available(iOS 11.0, *) {
            return safeAreaInsets
        } else {
            return .zero
        }
    }

    @objc public var compatibleSafeAreaLayoutGuide: UILayoutGuide {
        if #available(iOS 11.0, *) {
            return safeAreaLayoutGuide
        } else {
            return layoutMarginsGuide
        }
    }
}

1

ইন প্রতিকৃতি শুধুমাত্র আমি চেক করতে দৃশ্য ফ্রেমের এর প্রস্থ ও উচ্চতা ব্যবহার করুন:

override func viewDidLoad() {
    super.viewDidLoad()

    // iPhone Xr: -414 x 896
    // iPhone Xs Max: -414 x 896
    // iPhone X, Xs: -375 x 812

    if view.frame.width == 414 && view.frame.height == 896 || view.frame.width == 375 && view.frame.height == 812  {

        print("iPhone X")
    } else {

        print("not iPhone X")
    }

}

প্রতিকৃতি পর্দার মাত্রা এখানে তালিকাভুক্ত করা হয়

এখানে চিত্র বর্ণনা লিখুন


0

ডিভাইসটি কী তা জানতে চাওয়ার বেশ কয়েকটি কারণ রয়েছে।

  1. আপনি ডিভাইসের উচ্চতা (এবং প্রস্থ) পরীক্ষা করতে পারেন। এটি বিন্যাসের জন্য দরকারী, তবে আপনি সঠিক ডিভাইসটি জানতে চাইলে আপনি সাধারণত এটি করতে চান না।

  2. বিন্যাস উদ্দেশ্যে, আপনি ব্যবহার করতে পারেন UIView.safeAreaInsets

  3. আপনি যদি ডিভাইসটির নামটি প্রদর্শন করতে চান, উদাহরণস্বরূপ, ডায়াগনস্টিক উদ্দেশ্যে ইমেলটিতে অন্তর্ভুক্ত করার জন্য, ডিভাইসটির মডেলটি ব্যবহার করে পুনরুদ্ধার করার পরে sysctl (), আপনি নামটি সনাক্ত করতে এর সমপরিমাণটি ব্যবহার করতে পারেন:

    $ curl http://appledevicenames.com/devices/iPhone10,6
    
    iPhone X
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.