50 votes

Meilleure façon de détecter par programme le matériel iPad / iPhone

La raison j'ai besoin de savoir, c'est que sur un iPad, un UIPickerView a la même hauteur dans l'orientation paysage comme il le fait dans le portrait. Sur un iPhone, c'est différent. L'iPad guide de programmation introduit un "idiome" valeur à UIDevice:

    UIDevice* thisDevice = [UIDevice currentDevice];
    if(thisDevice.userInterfaceIdiom == UIUserInterfaceIdiomPad)
    {
        // iPad
    }
    else
    {
        // iPhone
    }

ce qui fonctionne bien pendant que vous êtes dans l'iPad (3.2), mais n'a pas d'iPhone (3.1.3) - de sorte qu'il ressemble il doit aussi être un ifdef conditionnelle, de compiler cette vérification, comme:

#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200
        UIDevice* thisDevice = [UIDevice currentDevice];
        if(thisDevice.userInterfaceIdiom == UIUserInterfaceIdiomPad)
        {
            // etc.
        }
#endif

Pour moi qui commence à être très maladroit. Ce qui est une meilleure façon?

64voto

Eiko Points 19502

Vérifier à l'exécution (votre première méthode) est complètement différent de #si à la compilation. Les directives du préprocesseur ne vous donneront pas une 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 l’iPhone.

17voto

progrmr Points 32412

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

15voto

lewisanderson Points 160

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
 

0voto

Sanniv Points 1200

Mettez cette méthode dans votre délégué d'application afin de 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;
}
 

0voto

Damon Points 1

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
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X