Y at-il un indicateur de compilateur Xcode spécifique qui se prépare lors de la compilation pour iPad?

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

  •  23-09-2019
  •  | 
  •  

Question

Y at-il un indicateur de compilateur Xcode spécifique qui se prépare lors de la compilation pour iPad?

Je veux compiler conditionnellement iPad vs le code iPhone / iPod Touch par exemple:

#ifdef TARGET_IPAD
   code for iPad
#else
   code for iPhone
#endif

Je sais qu'il ya déjà TARGET_OS_IPHONE et TARGET_CPU_ARM à TargetConditionals.h mais tout ce qui facilement et cible spécifiquement iPad?

-Rei

Était-ce utile?

La solution

L'API correcte à utiliser pour l'exécution de la vérification iPad vs iPhone / iPad Touch est:

BOOL deviceIsPad = ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad);

Filer d'en-tête de UIDevice comprend également une macro pratique, UI_USER_INTERFACE_IDIOM (), qui sera utile si votre cible de déploiement est

#define UI_USER_INTERFACE_IDIOM() ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] ? [[UIDevice currentDevice] userInterfaceIdiom] : UIUserInterfaceIdiomPhone)

Alors vous pouvez simplement dire négativement:

BOOL deviceIsPad = (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPhone);

Autres conseils

Au lieu d'utiliser des drapeaux à la compilation, vous devez utiliser vérifier l'exécution par exemple utiliser NSClassFromString pour voir si une classe existe parce que la même application peut être installé sur les deux appareils.

Et à cause de la possibilité d'exécuter l'application dans les deux appareils, il n'y a pas une compilation intégrée vérifier si elle cible iPad ou non.

Actuellement, je ne trouve rien qui vous permettra de vérifier si vous êtes sur un iPad, mais je ne suis pas non plus que si Apple recommande des contrôles d'exécution. Voici un extrait d'Apple:

  

En plus de vos contrôleurs de vue, toutes les classes qui sont partagées entre les appareils iPhone et iPad doivent inclure des macros de compilation conditionnelle pour isoler le code spécifique à l'appareil. Bien que vous pouvez également utiliser des contrôles d'exécution afin de déterminer si des classes ou des méthodes spécifiques étaient disponibles, ce faisant augmenterait seulement la taille de votre exécutable en ajoutant les chemins de code qui ne serait pas suivi sur un appareil ou l'autre. Laisser le supprimer du compilateur ce code aide à garder votre propre code.

Cependant, il n'y a pas de place que je pourrais trouver des informations plus précises sur les macros de compilation conditionnelle.

Pour plusieurs cibles partageant le même projet / code, je fais cela en modifiant les drapeaux C pour mon iPad cible.

Avec le [monapp] -iPad cible choisie comme cible active, choisissez Projet -> Modifier actif cible [monapp] -iPad. Recherche de « c » drapeaux et double-cliquez sur. Ajouter un drapeau pour « -D TARGET_IPAD ». Maintenant, le symbole TARGET_IPAD sera défini que pour votre iPad cible.

Bien sûr, cela ne fonctionne que si vous utilisez des cibles distinctes pour iPad et iPhone. Si vous utilisez le même binaire sur les deux, évidemment il n'y a rien que le compilateur peut faire pour vous. (Cependant, le 3.2 SDK à la fin de Janvier ne supporte même pas encore applications Universal.)

(sous la direction;. Je suis confus au sujet de la terminologie des applications "universelles", etc)

Ou -> juste pour être sûr

-(BOOL)isDeviceAniPad
{   
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200
 BOOL deviceIsPad = ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad);
 return deviceIsPad;
#endif
 return NO;
}

Je pense que cela va faire

-(BOOL)isDeviceAniPad
{   
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200
  return ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad);
#endif
  return NO;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top