iOS rileva se l'utente si trova su un iPad


260

Ho un'app che funziona su iPhone e iPod Touch, può funzionare su iPad Retina e tutto il resto, ma c'è bisogno di una regolazione. Devo rilevare se il dispositivo corrente è un iPad. Quale codice posso usare per rilevare se l'utente sta usando un iPad nel mio UIViewControllere quindi modificare qualcosa di conseguenza?

Risposte:


589

Esistono diversi modi per verificare se un dispositivo è un iPad. Questo è il mio modo preferito per verificare se il dispositivo è in realtà un iPad:

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

Il modo in cui lo uso

#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. */
}   

Altri esempi

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

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

Per una soluzione Swift, vedi questa risposta: https://stackoverflow.com/a/27517536/2057171


23
Il modo in cui lo usi non è efficiente come potrebbe essere. UI_USER_INTERFACE_IDIOM()è equivalente a ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] ? [[UIDevice currentDevice] userInterfaceIdiom] : UIUserInterfaceIdiomPhone). Si potrebbe essere meglio cache il risultato da qualche parte: BOOL iPad = UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad; … if (iPad) ….
Marcelo Cantos,

7
Userei hasPrefix anziché isEqualToString nel tuo ultimo metodo. In questo modo il codice funziona anche sul simulatore.
elbuild,

18
Swift:if UIDevice.currentDevice().userInterfaceIdiom == .Pad
Pang

2
Godful uso delle macro. Ottimo modo per offuscare il tuo codice.
gnasher729,

2
@ gnasher729 Più di 500 persone non sono d'accordo con te. Invece dei commenti sgraziati, perché non fornisci la tua risposta poiché pensi di avere un modo migliore per farlo.
Wrights CS

162

In Swift puoi utilizzare le seguenti uguaglianze per determinare il tipo di dispositivo nelle app Universal:

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

L'utilizzo sarebbe quindi qualcosa del tipo:

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

3
Sto modificando un link alla tua risposta nella risposta accettata. (In questo modo ottieni credito anche). Anche se questa è una domanda oggettiva, molte persone che visualizzano questa domanda provengono da Google e potrebbero essere alla ricerca di una soluzione Swift! : D
Albert Renshaw,

1
Grazie, @AlbertRenshaw. Lo pensavo anch'io. :) Btw: non penso che l'intenzione della domanda fosse quella di chiedere specificamente Objective-C, ma per iOS (che era Obj-C in quel momento). Almeno mi sarei aspettato di trovare la risposta sotto questa domanda anche per Swift.
Jeehut,

Ciao @sevensevens, grazie per il tuo feedback. Ho appena provato questo e ha funzionato per me in XCode 7.2 come target per iOS 9 nel simulatore. Quale versione di XCode stai usando? Forse non funziona su XCodes precedenti? I documenti dicono che userInterfaceIdiomè "Disponibile in iOS 3.2 e versioni successive". quindi questo non dovrebbe essere il problema.
Jeehut,

O potrebbe essere che stai eseguendo un'app solo iPhone sul simulatore iPad? In tal caso, ciò spiegherebbe la confusione, ma dovrebbe comportarsi in questo modo anche su dispositivi reali, credo. Come sottolineato da @Yunus Nedim Mehel nei commenti di @Richards, la situazione tornerà .Phoneinvece che .Pad.
Jeehut,

Spiacenti, il simulatore era impostato su iPhone. Devo smettere di apportare modifiche alle
02:00

35

Questo fa parte di UIDevice a partire da iOS 3.2, ad esempio:

[UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad

4
il linguaggio è generalmente migliore, ma se si esegue un'app per iPhone su iPad, questo restituirà UIUserInterfaceIdiomPhone.
Yunus Nedim Mehel,

25

Puoi anche usare questo

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

24

UI_USER_INTERFACE_IDIOM()restituisce iPad solo se l'app è per iPad o Universal. Se è un'app per iPhone in esecuzione su un iPad, non lo farà. Quindi dovresti invece controllare il modello.


15

Fai attenzione: se la tua app ha come target solo un dispositivo iPhone, iPad in esecuzione con la modalità compatibile con iPhone restituirà false per la seguente dichiarazione:

#define IPAD     UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad

Il modo giusto per rilevare un dispositivo iPad fisico è:

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

15

Ho scoperto che alcune soluzioni non funzionavano per me nel simulatore di Xcode. Invece, funziona:

objC

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

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

veloce

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

Anche in "Altri esempi" in Xcode il modello del dispositivo ritorna come "iPad Simulator", quindi la modifica sopra dovrebbe risolverlo.


Forse Apple ha aggiornato il simulatore per dire qualcosa come "iPad simulator" o "iPad 2.1" o qualcosa del genere ... se questo è il caso che potresti usare al hasSuffix:@"iPad"posto di isEqualToString@"iPad"... la soluzione migliore è registrare il modello di dispositivo che il simulatore restituisce e vai da lì ...
Albert Renshaw,

8

Molti modi per farlo in Swift :

Controlliamo il modello qui sotto (possiamo fare solo una ricerca con distinzione tra maiuscole e minuscole qui):

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

Controlliamo il modello qui sotto (possiamo fare una ricerca sensibile al maiuscolo / minuscolo qui):

    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().userInterfaceIdiomdi seguito restituisce iPad solo se l'app è per iPad o Universal. Se si tratta di un'app per iPhone in esecuzione su un iPad, non lo farà. Quindi dovresti invece controllare il modello. :

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

Questo frammento di seguito non viene compilato se la classe non eredita da un UIViewController, altrimenti funziona perfettamente. Indipendentemente da ciò, UI_USER_INTERFACE_IDIOM()restituisce iPad solo se l'app è per iPad o Universal. Se si tratta di un'app per iPhone in esecuzione su un iPad, non lo farà. Quindi dovresti invece controllare il modello. :

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

2
Non credo che sia necessario riscrivere le vecchie risposte alle domande taggate da Objective-C per velocizzare.
Christian Schnorr,

4
Sicuramente penso che la mia risposta sia utile perché in primo luogo tutte le risposte sono sparse sullo overflow dello stack. In secondo luogo, ciò che funzionava con le versioni precedenti di iOS a volte non funziona correttamente con iOS 8 e versioni successive. Quindi ho testato queste soluzioni e questa risposta può essere molto utile. Quindi non sono affatto d'accordo con te.
King-Wizard

Inoltre, la sintassi è diversa in Swift. Quindi è sempre utile per tutti fare un copia e incolla intelligente della risposta e comprendere gli specifici dadi e bulloni aggiornati.
King-Wizard


8

*

In rapido 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

Molte risposte sono buone, ma le uso così in swift 4

  1. Crea costante

    struct App {
        static let isRunningOnIpad = UIDevice.current.userInterfaceIdiom == .pad ? true : false
    }
  2. Usa così

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

Modifica: come suggerito, è sufficiente creare un'estensione su UIDevice

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

3
Perché preoccuparsi di uno Appstruct quando puoi fare lo stesso con UIDeviceun'estensione?
Cœur il

3

Puoi controllare rangeOfString per vedere la parola iPad esiste in questo modo.

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 != NSNotFoundritorna vero.
Cœur il

2

Ancora un altro modo Swifty:

//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 }
}

Uso:

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

In Swift 4.2 e 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
}

Se si desidera rilevare un dispositivo specifico

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

Perché così complicato? Ecco come lo faccio ...

Swift 4:

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

In questo modo puoi solo dire if iPad {}


1
Nota: questa domanda è stata posta nel 2012
Albert Renshaw,

0

Per le ultime versioni di iOS, aggiungi semplicemente UITraitCollection:

extension UITraitCollection {

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

e poi all'interno UIViewControllerbasta controllare:

if traitCollection.isIpad { ... }

4
Funziona anche quando l'app per iPad è in modalità schermo diviso? Quindi la classe di dimensioni orizzontali sarebbe compatta.
Oliver,

0
if(UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiom.pad)
 {
            print("This is iPad")
 }else if (UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiom.phone)
 {
            print("This is iPhone");
  }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.