web-dev-qa-db-fra.com

Meilleur moyen de détecter par programmation le matériel iPad/iPhone

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?

45
Adam Eberbach

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)
26
Cliff Ribaudo

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.

63
Eiko

J'aime ma isPad () fonction. Même code mais conservez-le à l'abri des regards et à un seul endroit.

17
progrmr

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
15
lewisanderson

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;
  }
1
Jack

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
0
Damon

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;
}
0
Sanniv

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.

0
Topsakal
BOOL isIpad()
{
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
        return YES;
    }
    return NO;
}
0
andyqee