Esiste una specifica Xcode flag di compilazione che viene impostato durante la compilazione per iPad?

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

  •  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

È stato utile?

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 è

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

Quindi, si può solo dire che, negativamente:

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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top