La raison pour laquelle j’ai besoin de le savoir est que, sur un iPad, un UIPickerView a la même hauteur en orientation paysage qu’en portrait. Sur un iPhone, c'est différent. Le guide de programmation pour iPad introduit une valeur "idiome" dans UIDevice:
UIDevice* thisDevice = [UIDevice currentDevice];
if(thisDevice.userInterfaceIdiom == UIUserInterfaceIdiomPad)
{
// iPad
}
else
{
// iPhone
}
qui fonctionne bien lorsque vous êtes sur iPad (3.2) mais pas sur iPhone (3.1.3) - il semble donc qu'il soit également nécessaire de disposer d'un ifdef pour compiler conditionnellement cette vérification, comme:
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200
UIDevice* thisDevice = [UIDevice currentDevice];
if(thisDevice.userInterfaceIdiom == UIUserInterfaceIdiomPad)
{
// etc.
}
#endif
Pour moi, cela commence à avoir l'air très maladroit. Quel est le meilleur moyen?
Je réponds à cela maintenant (et à cette date tardive) parce que beaucoup de réponses existantes sont assez anciennes, et le plus voté semble en fait être faux selon la documentation actuelle d'Apple (iOS 8.1, 2015)!
Pour prouver mon propos, voici le commentaire tiré du fichier d'en-tête Apples (regardez toujours la source et les en-têtes Apple):
/*The UI_USER_INTERFACE_IDIOM() macro is provided for use when
deploying to a version of the iOS less than 3.2. If the earliest
version of iPhone/iOS that you will be deploying for is 3.2 or
greater, you may use -[UIDevice userInterfaceIdiom] directly.*/
Par conséquent, la méthode actuellement recommandée par Apple pour détecter l'iPhone contre l'iPad est la suivante:
1) Sur les versions d'iOS ANTÉRIEURES à 3.2, utilisez la macro fournie par Apple:
// for iPhone use UIUserInterfaceIdiomPhone
if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
2) Sur les versions d'iOS 3.2 ou ultérieur, utilisez la propriété sur [UIDevice currentDevice]:
// for iPhone use UIUserInterfaceIdiomPhone
if([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad)
Vérifier à l'exécution (votre première méthode) est complètement différent de #if au moment de la compilation. Les directives du préprocesseur ne vous donneront pas d'application universelle.
La méthode préférée consiste à utiliser la macro d'Apple:
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
{
// The device is an iPad running iPhone 3.2 or later.
}
else
{
// The device is an iPhone or iPod touch.
}
Utilisez le SDK de base 3.2 (car la macro n’a pas été définie avant la version 3.2), vous pouvez cibler les versions antérieures du système d’exploitation pour le faire fonctionner sur votre iPhone.
J'aime ma isPad () fonction. Même code mais conservez-le à l'abri des regards et à un seul endroit.
Ma solution (fonctionne sur 3.2+):
#define IS_IPHONE (!IS_IPAD)
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPhone)
puis,
if (IS_IPAD)
// do something
ou
if (IS_IPHONE)
// do something else
Dans Swift, utilisez userInterfaceIdiom instance property as-
if UIDevice.current.userInterfaceIdiom == .phone {
print("iPhone")
}
& Pour d'autres appareils -
switch UIDevice.current.userInterfaceIdiom {
case .pad:
print("iPad")
case .phone:
print("iPhone")
case .tv:
print("TV")
case .carPlay:
print("carPlay")
default: break;
}
Si vous utilisez des fonctionnalités qui ne sont pas compatibles avec les versions antérieures, le meilleur moyen pour moi consiste à créer un #define dans l'en-tête précompilé. Exemple:
#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_3_2
#define USING_4_X
#endif
Ensuite, dans votre code, vous pouvez faire ceci:
BOOL exists = NO;
#ifdef USING_4_X
exists = [SomeObject someMethod:[url lastPathComponent]];
#else
exists = [SomeObject someMethod:[[url path] lastPathComponent]];
#endif
Placez cette méthode dans votre délégué d'application pour pouvoir l'appeler n'importe où en utilisant le [[[UIApplication sharedApplication] délégué]] isPad]
-(BOOL)isPad
{
BOOL isPad;
NSRange range = [[[UIDevice currentDevice] model] rangeOfString:@"iPad"];
if(range.location==NSNotFound)
{
isPad=NO;
}
else {
isPad=YES;
}
return isPad;
}
Si 1- vous avez déjà installé l'application sur votre appareil, 2- vous modifiez ses paramètres de construction pour qu'il s'agisse d'une application 'universelle', 3-. Installez l'application sur votre appareil au-dessus de la application existante (sans supprimer la précédente)
Vous constaterez peut-être que les solutions fournies ici pour détecter l'iPhone/iPad ne fonctionnent pas. Tout d’abord, supprimez l’application qui n’était «que» pour iPad/iPhone et installez-la directement sur votre appareil.
BOOL isIpad()
{
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
return YES;
}
return NO;
}