iOS détecte si l'utilisateur est sur un iPad

260

J'ai une application qui fonctionne sur l'iPhone et l'iPod Touch, elle peut fonctionner sur l'iPad Retina et tout, mais il doit y avoir un ajustement. J'ai besoin de détecter si l'appareil actuel est un iPad. Quel code puis-je utiliser pour détecter si l'utilisateur utilise un iPad sur mon ordinateur UIViewController, puis changer quelque chose en conséquence?

Albert Renshaw
la source

Réponses:

589

Il existe plusieurs façons de vérifier si un appareil est un iPad. C'est ma façon préférée de vérifier si l'appareil est bien un iPad:

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

La façon dont je l'utilise

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

Autres exemples

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

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

Pour une solution Swift, consultez cette réponse: https://stackoverflow.com/a/27517536/2057171

WrightsCS
la source
23
La façon dont vous l'utilisez n'est pas aussi efficace qu'elle pourrait l'être. UI_USER_INTERFACE_IDIOM()est équivalent à ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] ? [[UIDevice currentDevice] userInterfaceIdiom] : UIUserInterfaceIdiomPhone). Vous pourriez être mieux mise en cache quelque part le résultat: BOOL iPad = UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad; … if (iPad) ….
Marcelo Cantos
7
J'utiliserais hasPrefix plutôt que isEqualToString dans votre dernière méthode. De cette façon, le code fonctionne également sur le simulateur.
elbuild
18
Swift:if UIDevice.currentDevice().userInterfaceIdiom == .Pad
Pang
2
Utilisation illégitime des macros. Excellent moyen d'obscurcir votre code.
gnasher729
2
@ gnasher729 Plus de 500 personnes ont tendance à être en désaccord avec vous. Au lieu des commentaires sarcastiques, pourquoi ne fournissez-vous pas votre propre réponse car vous pensez que vous avez une meilleure façon de le faire.
WrightsCS
162

Dans Swift, vous pouvez utiliser les égalités suivantes pour déterminer le type d'appareil sur les applications universelles:

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

L'utilisation serait alors quelque chose comme:

if UIDevice.current.userInterfaceIdiom == .pad {
    // Available Idioms - .pad, .phone, .tv, .carPlay, .unspecified
    // Implement your logic here
}
Jeehut
la source
3
J'édite un lien vers votre réponse dans la réponse acceptée. (De cette façon, vous obtenez également du crédit). Même s'il s'agit d'une question objective-c, beaucoup de personnes qui consultent cette question viennent de Google et recherchent peut-être une solution Swift! : D
Albert Renshaw
1
Merci, @AlbertRenshaw. Je le pensais aussi. :) Btw: Je ne pense pas que l'intention de la question était de demander spécifiquement Objective-C, mais pour iOS (qui était Obj-C à ce moment-là). Au moins, je m'attendais à trouver la réponse sous cette question pour Swift également.
Jeehut
Bonjour @sevensevens, merci pour vos commentaires. Je viens de l'essayer et cela a fonctionné pour moi dans XCode 7.2 ciblant iOS 9 dans le simulateur. Quelle version de XCode utilisez-vous? Peut-être que cela ne fonctionne pas sur les anciens XCodes? Les documents disent userInterfaceIdiom: «Disponible dans iOS 3.2 et versions ultérieures». donc ça ne devrait pas être le problème.
Jeehut
Ou peut-être que vous exécutez une application uniquement iPhone sur le simulateur iPad? Dans ce cas, cela expliquerait la confusion - mais cela devrait également se comporter de cette façon sur de vrais appareils, je pense. Comme @Yunus Nedim Mehel le fait remarquer dans les commentaires de @Richards, cette situation reviendra .Phoneau lieu de .Pad.
Jeehut
Désolé - le simulateur était réglé sur iPhone. Je dois arrêter de faire des changements à 2 heures du matin
sevensevens
35

Cela fait partie d'UIDevice à partir d'iOS 3.2, par exemple:

[UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad
Richard
la source
4
idiome est généralement meilleur, mais si vous exécutez une application iphone sur iPad, cela renverra UIUserInterfaceIdiomPhone.
Yunus Nedim Mehel
25

Vous pouvez également utiliser ceci

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

UI_USER_INTERFACE_IDIOM()renvoie iPad uniquement si l'application est pour iPad ou Universal. Si c'est une application iPhone fonctionnant sur un iPad, ce ne sera pas le cas. Vous devriez donc plutôt vérifier le modèle.

malhal
la source
15

Soyez prudent: si votre application cible uniquement les appareils iPhone, l'iPad fonctionnant avec le mode compatible iPhone renverra false pour la déclaration ci-dessous:

#define IPAD     UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad

La bonne façon de détecter un appareil iPad physique est:

#define IS_IPAD_DEVICE      ([(NSString *)[UIDevice currentDevice].model hasPrefix:@"iPad"])
de pointe
la source
15

J'ai trouvé qu'une solution ne fonctionnait pas pour moi dans le simulateur dans Xcode. Au lieu de cela, cela fonctionne:

ObjC

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

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

Rapide

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

Dans les «autres exemples» de Xcode, le modèle d'appareil revient en tant que «simulateur d'iPad», donc le réglage ci-dessus devrait trier cela.

Andy Davies
la source
Peut-être qu'Apple a mis à jour le simulateur pour dire quelque chose comme "simulateur iPad" ou "iPad 2.1" ou quelque chose ... si c'est le cas, vous pouvez utiliser à la hasSuffix:@"iPad"place de isEqualToString@"iPad"... votre meilleur pari est de consigner le modèle d'appareil que le simulateur retourne et disparaît de là ...
Albert Renshaw
8

De nombreuses façons de le faire dans Swift :

Nous vérifions le modèle ci-dessous (nous ne pouvons faire qu'une recherche sensible à la casse ici):

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

Nous vérifions le modèle ci-dessous (nous pouvons faire une recherche sensible à la casse / insensible ici):

    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().userInterfaceIdiomci-dessous renvoie uniquement l'iPad si l'application est pour iPad ou Universal. S'il s'agit d'une application iPhone exécutée sur un iPad, ce ne sera pas le cas. Vous devriez donc plutôt vérifier le modèle. :

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

Cet extrait ci-dessous ne se compile pas si la classe n'hérite pas d'un UIViewController, sinon cela fonctionne très bien. Indépendamment UI_USER_INTERFACE_IDIOM()ne retourne iPad que si l'application est pour iPad ou Universal. S'il s'agit d'une application iPhone exécutée sur un iPad, ce ne sera pas le cas. Vous devriez donc plutôt vérifier le modèle. :

class func isUserUsingAnIpad() -> Bool {
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.Pad) {
        return true
    } else {
        return false
    }
}
Roi-sorcier
la source
2
Je ne pense pas qu'il soit nécessaire de réécrire rapidement les anciennes réponses aux questions marquées Objective-C.
Christian Schnorr
4
Je pense définitivement que ma réponse est utile car tout d'abord toutes les réponses sont dispersées sur débordement de pile. Deuxièmement, ce qui fonctionnait avec les anciennes versions d'iOS ne fonctionne pas correctement parfois avec iOS 8 et supérieur. J'ai donc testé ces solutions et cette réponse peut être très utile. Je ne suis donc pas du tout d'accord avec vous.
King-Wizard
En plus de cela, la syntaxe est différente dans Swift. Il est donc toujours utile pour tout le monde de faire un copier-coller intelligent de la réponse et de comprendre les écrous et boulons spécifiques à jour.
King-Wizard
8

*

Dans swift 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
    }
Ashok R
la source
8

Beaucoup de réponses sont bonnes mais j'utilise comme ça dans swift 4

  1. Créer une constante

    struct App {
        static let isRunningOnIpad = UIDevice.current.userInterfaceIdiom == .pad ? true : false
    }
  2. Utilisez comme ça

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

Edit: Comme suggéré, Cœur crée simplement une extension sur UIDevice

extension UIDevice {
    static let isRunningOnIpad = UIDevice.current.userInterfaceIdiom == .pad ? true : false
}
Rohit Sisodia
la source
3
Pourquoi s'embêter avec une Appstructure quand on peut faire de même avec une UIDeviceextension?
Cœur
3

Vous pouvez vérifier le rangeOfString pour voir le mot iPad existe comme ceci.

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

if ([deviceModel rangeOfString:@"iPad"].location != NSNotFound)  {
NSLog(@"I am an iPad");
} else {
NSLog(@"I am not an iPad");
}
LearningGuy
la source
["I am not an iPad" rangeOfString:@"iPad"].location != NSNotFoundrenvoie vrai.
Cœur
2

Encore une autre façon 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 }
}

Usage:

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

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

if UIDevice.type == TV {
    //it's an TV!
}
Aviel Gross
la source
2

Dans Swift 4.2 et 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
}

Si vous souhaitez détecter un appareil spécifique

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
}
iOS
la source
1

Pourquoi si compliqué? C'est comme ça que je le fais ...

Swift 4:

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

De cette façon, vous pouvez simplement dire if iPad {}

The Ruffus
la source
1
Remarque: Cette question a été posée en 2012
Albert Renshaw
0

Pour les dernières versions d'iOS, ajoutez simplement UITraitCollection:

extension UITraitCollection {

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

puis dans UIViewControllerjuste vérifier:

if traitCollection.isIpad { ... }
Bartłomiej Semańczyk
la source
4
Cela fonctionne-t-il également lorsque l'iPad-App est en mode écran partagé? La classe de taille horizontale serait alors compacte.
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");
  }
Rajesh Sharma
la source