iOS का पता लगाता है कि उपयोगकर्ता iPad पर है या नहीं


260

मेरे पास एक ऐप है जो आईफोन और आईपॉड टच पर चलता है, यह रेटिना आईपैड और सब कुछ पर चल सकता है, लेकिन एक समायोजन की आवश्यकता है। मुझे पता लगाने की आवश्यकता है कि क्या वर्तमान डिवाइस एक iPad है। यदि उपयोगकर्ता मेरे में एक iPad का उपयोग कर रहा है UIViewControllerऔर फिर उसके अनुसार कुछ बदल सकता है तो मैं किस कोड का उपयोग कर सकता हूं ?

जवाबों:


589

यह जांचने के लिए कुछ तरीके हैं कि कोई उपकरण iPad है या नहीं। यह जाँचने का मेरा पसंदीदा तरीका है कि क्या डिवाइस वास्तव में iPad है:

if ( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad )
{
    return YES; /* Device is iPad */
}

जिस तरह से मैं इसका इस्तेमाल करता हूं

#define IDIOM    UI_USER_INTERFACE_IDIOM()
#define IPAD     UIUserInterfaceIdiomPad

if ( IDIOM == IPAD ) {
    /* do something specifically for iPad. */
} else {
    /* do something specifically for iPhone or iPod touch. */
}   

अन्य उदाहरण

if ( [(NSString*)[UIDevice currentDevice].model hasPrefix:@"iPad"] ) {
    return YES; /* Device is iPad */
}

#define IPAD     (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
if ( IPAD ) 
     return YES;

एक स्विफ्ट समाधान के लिए, इस उत्तर को देखें: https://stackoverflow.com/a/27517536/2057171


23
जिस तरह से आप इसका उपयोग करते हैं वह उतना कुशल नहीं है जितना कि यह हो सकता है। UI_USER_INTERFACE_IDIOM()के बराबर है ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] ? [[UIDevice currentDevice] userInterfaceIdiom] : UIUserInterfaceIdiomPhone)। आप कहीं और परिणाम को कैशिंग से बेहतर हो सकते हैं BOOL iPad = UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad; … if (iPad) …:।
मार्सेलो कैंटोस

7
मैं अपने अंतिम विधि में isEqualToString के बजाय hasPrefix का उपयोग करूंगा। इस तरह कोड सिम्युलेटर पर भी काम करता है।
11

18
स्विफ्ट:if UIDevice.currentDevice().userInterfaceIdiom == .Pad
पैंग

2
मैक्रोज़ का ईश्वरीय उपयोग। अपने कोड को बाधित करने का शानदार तरीका।
gnasher729

2
@ gnasher729 500+ लोग आपसे असहमत हैं। कर्कश टिप्पणियों के बजाय, आप अपना जवाब क्यों नहीं देते क्योंकि आपको लगता है कि आपके पास ऐसा करने का बेहतर तरीका है।
राइट्स

162

में स्विफ्ट आप यह निर्धारित करने के लिए निम्न समानताओं का उपयोग कर सकते डिवाइस की तरह यूनिवर्सल क्षुधा पर:

UIDevice.current.userInterfaceIdiom == .phone
// or
UIDevice.current.userInterfaceIdiom == .pad

तब उपयोग कुछ इस तरह होगा:

if UIDevice.current.userInterfaceIdiom == .pad {
    // Available Idioms - .pad, .phone, .tv, .carPlay, .unspecified
    // Implement your logic here
}

3
मैं आपके उत्तर की लिंक को स्वीकृत उत्तर में संपादित कर रहा हूँ। (इस तरह आपको क्रेडिट भी मिलता है)। हालांकि यह एक ऑब्जेक्टिव-सी प्रश्न है, लेकिन इस प्रश्न को देखने वाले अधिकांश लोग Google से आ रहे हैं और स्विफ्ट समाधान की खोज कर रहे हैं! : डी
अल्बर्ट रेनशॉ

1
धन्यवाद, @AlbertRenshaw मैं भी ऐसा सोचा था। :) Btw: मुझे नहीं लगता कि प्रश्न का उद्देश्य विशेष रूप से ऑब्जेक्टिव-सी के लिए पूछना था, लेकिन iOS के लिए (जो उस समय ओबज-सी था)। कम से कम मैंने स्विफ्ट के लिए भी इस प्रश्न के तहत उत्तर खोजने की उम्मीद की होगी।
जीहट

हाय @sevensevens, आपकी प्रतिक्रिया के लिए धन्यवाद। मैंने अभी-अभी इसकी कोशिश की और इसने मेरे लिए XCode 7.2 में सिम्युलेटर 9 में iOS 9 को लक्ष्य बनाकर काम किया। आप XCode के किस संस्करण का उपयोग कर रहे हैं? शायद यह पुराने XCodes पर काम नहीं करता है? डॉक्स का कहना userInterfaceIdiomहै कि 'iOS 3.2 और बाद में उपलब्ध है।' ताकि समस्या न हो।
जेहुत

या यह हो सकता है कि आप आईपैड सिम्युलेटर पर केवल आईफोन चला रहे हों? उस मामले में, यह भ्रम की व्याख्या करेगा - लेकिन यह भी वास्तविक उपकरणों पर इस तरह का व्यवहार करना चाहिए, मुझे लगता है। जैसा कि @ यूनुस नेदिम मेहेल बताते हैं @ रिचर्ड्स की टिप्पणियों में कहा गया है कि स्थिति .Phoneबदले की ओर लौट आएगी .Pad
जेहुत

क्षमा करें - आईफ़ोन पर सिम्युलेटर सेट किया गया था। 2:00 पर बदलाव करना बंद कर
देंगे

35

यह iOS 3.2 के रूप में UIDevice का हिस्सा है, जैसे:

[UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad

4
मुहावर आम तौर पर बेहतर है लेकिन अगर आप iPad पर iPhone ऐप चला रहे हैं तो इससे UIUserInterfaceIdiomPhone वापस आ जाएगा।
यूनुस नेदिम मेहेल

25

आप भी इसका इस्तेमाल कर सकते हैं

#define IPAD UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad
...
if (IPAD) {
   // iPad
} else {
   // iPhone / iPod Touch
}

24

UI_USER_INTERFACE_IDIOM()यदि ऐप iPad या यूनिवर्सल के लिए है तो केवल iPad लौटाता है। अगर इसका एक iPhone iPad पर चल रहा है तो यह नहीं होगा। इसलिए आपको इसके बजाय मॉडल की जांच करनी चाहिए।


15

सावधान रहें: यदि आपका ऐप केवल iPhone डिवाइस को लक्षित कर रहा है, तो iPhone संगत मोड के साथ चलने वाला iPad नीचे दिए गए विवरण के लिए गलत होगा:

#define IPAD     UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad

भौतिक आईपैड डिवाइस का पता लगाने का सही तरीका है:

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

15

मैंने पाया कि कुछ समाधान मेरे लिए Xcode के सिम्युलेटर में काम नहीं किया। इसके बजाय, यह काम करता है:

ObjC

NSString *deviceModel = (NSString*)[UIDevice currentDevice].model;

if ([[deviceModel substringWithRange:NSMakeRange(0, 4)] isEqualToString:@"iPad"]) {
    DebugLog(@"iPad");
} else {
    DebugLog(@"iPhone or iPod Touch");
}

तीव्र

if UIDevice.current.model.hasPrefix("iPad") {
    print("iPad")
} else {
    print("iPhone or iPod Touch")
}

Xcode में 'अन्य उदाहरणों' में भी डिवाइस मॉडल 'iPad सिमुलेटर' के रूप में वापस आता है, इसलिए ऊपर दिए गए ट्वीक को इस प्रकार छांटना चाहिए।


हो सकता है कि Apple ने "iPad सिम्युलेटर" या "iPad 2.1" या कुछ और कहने के लिए सिम्युलेटर को अपडेट किया हो ... अगर ऐसा है तो आप hasSuffix:@"iPad"इसके बजाय उपयोग कर सकते हैं isEqualToString@"iPad"... आपका सबसे अच्छा शर्त उस डिवाइस मॉडल को लॉग करना है जिसे सिम्युलेटर वापस करता है और जाता है वहाँ से ...
अल्बर्ट रेनशॉ

8

स्विफ्ट में ऐसा करने के कई तरीके :

हम नीचे दिए गए मॉडल की जांच करते हैं (हम केवल यहां केस संवेदनशील खोज कर सकते हैं):

class func isUserUsingAnIpad() -> Bool {
    let deviceModel = UIDevice.currentDevice().model
    let result: Bool = NSString(string: deviceModel).containsString("iPad")
    return result
}

हम नीचे दिए गए मॉडल की जांच करते हैं (हम यहां केस संवेदनशील / असंवेदनशील खोज कर सकते हैं):

    class func isUserUsingAnIpad() -> Bool {
        let deviceModel = UIDevice.currentDevice().model
        let deviceModelNumberOfCharacters: Int = count(deviceModel)
        if deviceModel.rangeOfString("iPad",
                                     options: NSStringCompareOptions.LiteralSearch,
                                     range: Range<String.Index>(start: deviceModel.startIndex,
                                                                end: advance(deviceModel.startIndex, deviceModelNumberOfCharacters)),
                                     locale: nil) != nil {
            return true
        } else {
            return false
        }
   }

UIDevice.currentDevice().userInterfaceIdiomयदि ऐप iPad या यूनिवर्सल के लिए है तो केवल iPad लौटाता है। अगर यह एक iPad पर चलाया जा रहा iPhone ऐप है तो यह नहीं होगा। इसलिए आपको इसके बजाय मॉडल की जांच करनी चाहिए। :

    class func isUserUsingAnIpad() -> Bool {
        if UIDevice.currentDevice().userInterfaceIdiom == UIUserInterfaceIdiom.Pad {
            return true
        } else {
            return false
        }
   }

नीचे यह स्निपेट संकलित नहीं करता है यदि वर्ग को विरासत में नहीं मिलता है UIViewController, अन्यथा यह ठीक काम करता है। भले UI_USER_INTERFACE_IDIOM()ही ऐप iPad या यूनिवर्सल के लिए ही iPad लौटाता है। अगर यह एक iPad पर चलाया जा रहा iPhone ऐप है तो यह नहीं होगा। इसलिए आपको इसके बजाय मॉडल की जांच करनी चाहिए। :

class func isUserUsingAnIpad() -> Bool {
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.Pad) {
        return true
    } else {
        return false
    }
}

2
मुझे नहीं लगता कि वस्तुनिष्ठ-सी के प्रश्नों के पुराने उत्तरों को फिर से लिखने की आवश्यकता है।
क्रिश्चियन स्चनोर जूल

4
मुझे निश्चित रूप से लगता है कि मेरा उत्तर उपयोगी है क्योंकि सबसे पहले सभी उत्तर स्टैक ओवरफ्लो पर बिखरे हुए हैं। दूसरी बात जो iOS के पुराने संस्करणों के साथ काम करती है वह कभी-कभी iOS 8 और इसके बाद के संस्करण के साथ सही ढंग से काम नहीं करती है। इसलिए मैंने इन समाधानों का परीक्षण किया और यह उत्तर अत्यधिक उपयोगी हो सकता है। इसलिए मैं आपसे बिल्कुल भी सहमत नहीं हूं।
राजा-जादूगर

उसके ऊपर स्विफ्ट में वाक्य रचना अलग है। तो यह हमेशा हर किसी के लिए उपयोगी होता है कि उत्तर की एक बुद्धिमान कॉपी पेस्ट करें और विशिष्ट अप-टू-डेट नट और बोल्ट को समझें।
राजा-जादूगर


8

*

स्विफ्ट 3.0 में

*

 if UIDevice.current.userInterfaceIdiom == .pad {
        //pad
    } else if UIDevice.current.userInterfaceIdiom == .phone {
        //phone
    } else if UIDevice.current.userInterfaceIdiom == .tv {
        //tv
    } else if UIDevice.current.userInterfaceIdiom == .carPlay {
        //CarDisplay
    } else {
        //unspecified
    }

8

कई उत्तर अच्छे हैं, लेकिन मैं इस तरह का उपयोग स्विफ्ट 4 में करता हूं

  1. लगातार बनाएं

    struct App {
        static let isRunningOnIpad = UIDevice.current.userInterfaceIdiom == .pad ? true : false
    }
  2. इस तरह का उपयोग करें

    if App.isRunningOnIpad {
        return load(from: .main, identifier: identifier)
    } else {
        return load(from: .ipad, identifier: identifier)
    }

संपादित करें: जैसा कि सुझाव दिया गया है कि बस UIDevice पर एक एक्सटेंशन बनाएं

extension UIDevice {
    static let isRunningOnIpad = UIDevice.current.userInterfaceIdiom == .pad ? true : false
}

3
Appजब आप एक UIDeviceएक्सटेंशन के साथ एक ही कर सकते हैं तो एक संरचना के साथ परेशान क्यों ?
Cœur

3

IPad की तरह मौजूद शब्द को देखने के लिए आप रेंजऑफस्ट्रिंग की जांच कर सकते हैं।

NSString *deviceModel = (NSString*)[UIDevice currentDevice].model;

if ([deviceModel rangeOfString:@"iPad"].location != NSNotFound)  {
NSLog(@"I am an iPad");
} else {
NSLog(@"I am not an iPad");
}

["I am not an iPad" rangeOfString:@"iPad"].location != NSNotFoundसच लौटाता है।
Cœur

2

अभी तक एक और तरीका है:

//MARK: -  Device Check
let iPad = UIUserInterfaceIdiom.Pad
let iPhone = UIUserInterfaceIdiom.Phone
@available(iOS 9.0, *) /* AppleTV check is iOS9+ */
let TV = UIUserInterfaceIdiom.TV

extension UIDevice {
    static var type: UIUserInterfaceIdiom 
        { return UIDevice.currentDevice().userInterfaceIdiom }
}

उपयोग:

if UIDevice.type == iPhone {
    //it's an iPhone!
}

if UIDevice.type == iPad {
    //it's an iPad!
}

if UIDevice.type == TV {
    //it's an TV!
}

2

में स्विफ्ट 4.2 और Xcode 10

if UIDevice().userInterfaceIdiom == .phone {
    //This is iPhone
} else if UIDevice().userInterfaceIdiom == .pad { 
    //This is iPad
} else if UIDevice().userInterfaceIdiom == .tv {
    //This is Apple TV
}

यदि आप विशिष्ट उपकरण का पता लगाना चाहते हैं

let screenHeight = UIScreen.main.bounds.size.height
if UIDevice().userInterfaceIdiom == .phone {
    if (screenHeight >= 667) {
        print("iPhone 6 and later")
    } else if (screenHeight == 568) {
        print("SE, 5C, 5S")
    } else if(screenHeight<=480){
        print("4S")
    }
} else if UIDevice().userInterfaceIdiom == .pad { 
    //This is iPad
}

1

इतना जटिल क्यों? यह मेरा इसे करने का तरीका है...

स्विफ्ट 4:

var iPad : Bool {
    return UIDevice.current.model.contains("iPad")
}

इस तरह आप बस कह सकते हैं if iPad {}


1
नोट: यह प्रश्न 2012 में पूछा गया था
अल्बर्ट रेनशॉ

0

IOS के नवीनतम संस्करणों के लिए, बस जोड़ें UITraitCollection:

extension UITraitCollection {

    var isIpad: Bool {
        return horizontalSizeClass == .regular && verticalSizeClass == .regular
    }
}

और फिर UIViewControllerबस जाँच करें:

if traitCollection.isIpad { ... }

4
क्या यह तब भी काम करता है जब iPad-App स्प्लिट स्क्रीन मोड में है? फिर क्षैतिज आकार वर्ग कॉम्पैक्ट होगा।
ओलिवर

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.