Comment peut-on obtenir UI_USER_INTERFACE_IDIOM () pour fonctionner avec l'iPhone OS SDK <3.2

StackOverflow https://stackoverflow.com/questions/2576356

  •  24-09-2019
  •  | 
  •  

Question

Apple recommande d'utiliser le code suivant pour détecter si en cours d'exécution sur un iPad ou iPhone / iPod Touch:

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
  // The device is an iPad running iPhone 3.2 or later.
  // [for example, load appropriate iPad nib file]
}
else {
  // The device is an iPhone or iPod touch.
  // [for example, load appropriate iPhone nib file]
}

Le problème est que UI_USER_INTERFACE_IDIOM () et UIUserInterfaceIdiomPad ne sont pas définies dans le SDK avant 3,2. Cela semble tout à fait vaincre le but d'une telle fonction. Ils ne peuvent être compilés et exécutés sur iPhone OS 3.2 (iPhone OS 3.2 ne peut être exécuté sur iPad). Donc, si vous pouvez utiliser UI_USER_INTERFACE_IDIOM (), le résultat sera toujours indiquer un iPad.

Si vous incluez ce code et cible OS 3.1.3 (le plus récent iPhone / iPod Touch OS) afin de tester votre code d'application universelle liée iPhone, vous obtiendrez des erreurs du compilateur puisque les symboles ne sont pas définis en 3.1. 3 ou plus tôt, lors de la compilation pour le simulateur iPhone 3.1.3.

Si tel est le recommandé par Apple approche de la durée d'exécution dispositif de détection, ce que je fais mal? Quelqu'un at-il réussi en utilisant cette approche à l'appareil de détection?

Était-ce utile?

La solution

Je le fais pour obtenir le code pour compiler à la fois 3.1.3 et 3.2:

BOOL iPad = NO;
#ifdef UI_USER_INTERFACE_IDIOM
iPad = (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad);
#endif
if (iPad) {
// iPad specific code here
} else {
// iPhone/iPod specific code here
}

J'ai aussi écrit un billet de blog rapide à ce sujet ici: http: // www. programbles.com/2010/04/03/compiling-conditional-code-in-universal-iphone-ipad-applications/

Autres conseils

Voici ce que j'utilise:

- (BOOL) amIAnIPad {
    #if (__IPHONE_OS_VERSION_MAX_ALLOWED >= 30200)
        if ([[UIDevice currentDevice] respondsToSelector: @selector(userInterfaceIdiom)])
            return ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad);
    #endif
    return NO;
}

Cette compilation conditionnelle, de sorte que vous pouvez toujours construire pour la carte SIM 3.0. Il vérifie ensuite si la classe UIDevice répond au sélecteur. Si l'un de ces échouent, ce n'est pas un iPad.

  

Si cette approche est de exécution par Apple recommandé   dispositif de détection, ce que je fais mal? Quelqu'un at-il réussi à l'aide   cette approche à l'appareil de détection?

est la solution pour runtime Détection:

#define isIPhone (![[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] || [[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)

Après cela, vous pouvez facilement tester partout dans votre code:

if (isIPhone) { ... }

La différence entre ceci et en utilisant #if / #ifdef est que ce test d'exécution, alors que #if est le test de compilation.

Je pense que le test d'exécution est meilleure, parce que vous pouvez utiliser une exactable pour toute version du système d'exploitation dans ce cas. Si vous utilisez contrôle la compilation, vous aurez besoin de produire différentes pour différentes executables versions OS.

Si votre problème est à la compilation des erreurs, vous devriez juste compilez contre la dernière version du SDK (voir aussi Comment accéder à cadre faible lié à iOS? ).

Je crois que la réponse est tout simplement ne pas essayer d'exécuter le code sur iPhone simulateur 3.1.3 ou plus tôt. compiler toujours avec un SDK 3.2. Le simulateur iPhone 3.2 vous obtiendrez le simulateur iPad ou compiler pour iPhone appareil 3.2 et mis l'application sur un téléphone pour le tester.

Il n'y a pas moyen de compiler contre 3.2 SDK et utiliser un simulateur 3.1.3 ou une version antérieure.

Au lieu de toute substance à base du compilateur que j'utilise:

- (BOOL)deviceIsAnIPad {
if ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)])
    //We can test if it's an iPad. Running iOS3.2+
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)
        return YES; //is an iPad
    else 
        return NO; //is an iPhone
else 
    return NO; //does not respond to selector, therefore must be < iOS3.2, therefore is an iPhone
}

Déclarer en utilisant cette

#ifdef UI_USER_INTERFACE_IDIOM
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#else
#define IS_IPAD false
#endif

puis utilisez l'enregistrement comme ci-dessous

#define DetailLabel_PosX (IS_IPAD ? 200 : 160)

Il y a aussi certains définissent pour le contrôle de l'iPhone 5

#define IS_IPHONE5 (([[UIScreen mainScreen] bounds].size.height-568)?NO:YES)
#define IOS_OLDER_THAN_6 ([[[UIDevice currentDevice] systemVersion] floatValue] < 6.0 )
#define IOS_NEWER_OR_EQUAL_TO_6 ([[[UIDevice currentDevice] systemVersion] floatValue] >= 6.0 )
  

Cela semble complètement vaincre le but d'une telle fonction. Ils   ne peut être compilé et exécuté sur iPhone   OS 3.2 (iPhone OS 3.2 ne peut être exécuté   sur iPad). Donc, si vous pouvez utiliser   UI_USER_INTERFACE_IDIOM (), le résultat   sera toujours pour indiquer un iPad.

Ceci est tout à fait incorrect. Il peut être compilé sur SDK base de 3,2, mais il peut être run sur tout système d'exploitation, si vous définissez la cible de déploiement appropriée.

UI_USER_INTERFACE_IDIOM () et UIUserInterfaceIdiomPad peut être utilisé sur iOS3.2 et vers le haut, la partie importante étant la « vers le haut ». Sûr. iOS3.2 est uniquement pour iPad, mais iOS4.0 et au-delà exécuteront sur les iPhones et iPads, de sorte que le chèque n'est pas aussi inutile que vous le pensez.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top