Esiste una specifica Xcode flag di compilazione che viene impostato durante la compilazione per iPad?
-
23-09-2019 - |
Domanda
C'è una bandiera del compilatore specifica Xcode che viene impostato durante la compilazione per iPad?
Voglio compilazione condizionale iPad vs codice di iPhone / iPod Touch per esempio:
#ifdef TARGET_IPAD
code for iPad
#else
code for iPhone
#endif
So che c'è già TARGET_OS_IPHONE e TARGET_CPU_ARM in TargetConditionals.h ma tutto ciò che si rivolge in modo semplice e in particolare iPad?
-Rei
Soluzione
L'API corretta da utilizzare per il controllo in fase di esecuzione di iPad vs iPhone / iPad Touch è:
BOOL deviceIsPad = ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad);
Il filer intestazione UIDevice comprende anche una macro comoda, UI_USER_INTERFACE_IDIOM (), che sarà utile se la destinazione della distribuzione è Quindi, si può solo dire che, negativamente: #define UI_USER_INTERFACE_IDIOM() ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] ? [[UIDevice currentDevice] userInterfaceIdiom] : UIUserInterfaceIdiomPhone)
BOOL deviceIsPad = (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPhone);
Altri suggerimenti
Invece di usare bandiere compilazione, si dovrebbe usare runtime controllare per esempio utilizzare NSClassFromString
per vedere se una classe esiste perché la stessa applicazione può essere installato su entrambi i dispositivi.
E a causa della possibilità di eseguire l'applicazione in entrambi i dispositivi, non c'è un tempo di compilazione incorporato verificare se esso si rivolge iPad o no.
Al momento non ho trovato nulla che possa permetterà di controllare se si è su un iPad, ma non sono sicuro se anche Apple consiglia controlli runtime. Ecco un estratto da Apple:
Oltre ai controller di vista, tutte le classi che sono condivisi tra i dispositivi iPhone e iPad hanno bisogno di includere le macro di compilazione condizionale per isolare il codice specifico del dispositivo. Anche se si potrebbe anche utilizzare i controlli di runtime per determinare se classi o metodi specifici erano disponibili, così facendo non farebbe che aumentare la dimensione del vostro eseguibile con l'aggiunta di percorsi di codice che non sarebbe essere seguite su un dispositivo o l'altro. Lasciando il compilatore rimuovere questo codice aiuta a mantenere il vostro pulitore codice.
Tuttavia, non c'è posto sono riuscito a trovare informazioni più specifiche sulle macro di compilazione condizionale.
Per bersagli multipli che condividono lo stesso progetto / codice, sto facendo tutto questo modificando le bandiere C per il mio obiettivo iPad.
Con il [myapp] -iPad bersaglio scelto come bersaglio attiva, scegliere Project -> Modifica attiva [myapp] -iPad destinazione. Cerca "C bandiere" e fare doppio clic. Aggiungi una bandiera per "-D TARGET_IPAD". Ora il TARGET_IPAD simbolo sarà definito solo per il vostro target iPad.
Naturalmente, questo funziona solo se si sta utilizzando obiettivi separati per iPad e iPhone. Se si sta eseguendo lo stesso binario su entrambi, ovviamente, non c'è nulla che il compilatore può fare per voi. (Tuttavia, il 3.2 SDK a partire dalla fine di gennaio non ha nemmeno il supporto universale applicazioni ancora.)
(a cura;. Ero confuso sulla terminologia di applicazioni "universali", ecc)
O -> solo per essere sicuri
-(BOOL)isDeviceAniPad
{
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200
BOOL deviceIsPad = ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad);
return deviceIsPad;
#endif
return NO;
}
Credo che questo farà
-(BOOL)isDeviceAniPad
{
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200
return ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad);
#endif
return NO;
}