web-dev-qa-db-fra.com

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

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. Je dois détecter si le périphérique actuel est un iPad. Quel code puis-je utiliser pour détecter si l'utilisateur utilise un iPad dans ma UIViewController et modifier ensuite quelque chose en conséquence?

219
Albert Renshaw

Il existe plusieurs moyens de vérifier si un appareil est un iPad. Voici ma méthode préférée pour vérifier si le périphérique 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, voir la réponse suivante: https://stackoverflow.com/a/27517536/2057171

554
WrightsCS

Dans Swift, vous pouvez utiliser les égalités suivantes pour déterminer le type de périphérique sur les applications Universal:

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

Usage serait alors quelque chose comme:

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

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

[UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad
33
Richard

Vous pouvez aussi utiliser ceci

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

UI_USER_INTERFACE_IDIOM () ne renvoie iPad que si l'application est pour iPad ou Universal. Si c'est une application iPhone en cours d'exécution sur un iPad, alors ce ne sera pas. Donc, vous devriez plutôt vérifier le modèle.

19
malhal

Attention: si votre application cible uniquement un iPhone, l'iPad fonctionnant en mode compatible iphone renverra la valeur false pour la déclaration ci-dessous:

#define IPAD     UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad

La bonne façon de détecter un périphérique iPad physique est la suivante:

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

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")
}

De plus, dans les "Autres exemples" de Xcode, le modèle d'appareil revient sous le nom de "Simulateur iPad".

11
Andy Davies

De nombreuses façons de faire cela 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().userInterfaceIdiom ci-dessous ne renvoie l'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. Donc, vous devriez 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 compile pas si la classe n'hérite pas d'une UIViewController, sinon cela fonctionne très bien. Quoi qu'il en soit, UI_USER_INTERFACE_IDIOM() ne renvoie l'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. Donc, vous devriez plutôt vérifier le modèle. :

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

*

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
    }
7
Ashok R

Vous pouvez vérifier le rangeOfString pour voir de l'iPad Word existe comme ça.

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

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

Beaucoup de réponses sont bonnes mais je les utilise comme cela dans Swift 4

  1. Créer une constante

    struct App {
        static let isRunningOnIpad = UIDevice.current.userInterfaceIdiom == .pad ? true : false
    }
    
  2. Utiliser 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

}

3
Rohit Sisodia

Encore une autre façon de 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!
}
2
Aviel Gross

Pourquoi si compliqué? Voici comment je le fais ...

Swift 4:

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

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

1
The Ruffus

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 voulez détecter un périphérique 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
}
0
iOS

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

extension UITraitCollection {

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

et ensuite dans UIViewController il suffit de vérifier:

if traitCollection.isIpad { ... }
0
if(UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiom.pad)
 {
            print("This is iPad")
 }else if (UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiom.phone)
 {
            print("This is iPhone");
  }
0
Rajesh Sharma