Gibt es einen speziellen Xcode Compiler-Flag, das gesetzt wird, wenn für iPad Kompilieren?

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

  •  23-09-2019
  •  | 
  •  

Frage

Gibt es einen speziellen Xcode Compiler-Flag, das gesetzt wird, wenn für iPad Kompilieren?

Ich mag bedingt kompilieren iPad vs iPhone / iPod Touch-Code zum Beispiel:

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

Ich weiß, es ist schon TARGET_OS_IPHONE und TARGET_CPU_ARM in TargetConditionals.h aber alles so leicht und speziell Ziele iPad?

-rei

War es hilfreich?

Lösung

Die richtige API Verwendung für Laufzeitüberprüfung von iPad vs. iPhone / iPad Touch ist:

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

Der UIDevice Header Filer enthält auch eine bequeme Makro, UI_USER_INTERFACE_IDIOM (), die hilfreich sein, wenn Ihre Bereitstellung Ziel

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

So könnte man einfach sagen: negativ:

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

Andere Tipps

Statt Kompilierung-Flags verwenden, sollten Sie Laufzeitprüfung verwenden z.B. Verwendung NSClassFromString, um zu sehen, ob eine Klasse existiert, weil die gleiche App kann auf beiden Geräten installiert werden.

Und wegen der Möglichkeit, die App auf beiden Geräten laufen, gibt es keine eingebaute in Compile-Zeit überprüft, ob es zielt auf iPad oder nicht.

Zur Zeit habe ich nichts finden, dass Sie lassen würde, wenn Sie auf einem iPad sind, aber ich bin auch nicht sicher, ob Apple-Laufzeitprüfungen empfiehlt. Hier ist ein Auszug aus Apple:

  

Zusätzlich zu Ihren View-Controller, alle Klassen, die zwischen iPhone und iPad-Geräten gemeinsam genutzt werden müssen bedingte Kompilierung Makros zu isolieren gerätespezifischen Codes enthalten. Obwohl Sie auch Laufzeitprüfungen, um festzustellen, ob bestimmte Klassen oder Methoden zur Verfügung standen, dabei würde nur erhöhen Sie die Größe Ihrer ausführbaren durch Hinzufügen von Codepfade, die nicht auf einem Gerät oder anderen folgen würde nutzen könnten. Überlassen Sie der Compiler den Code entfernen hilft, Ihren Code sauberer.

Allerdings gibt es keinen Platz, ich mehr spezifische Informationen über die bedingte Kompilierung Makros finden konnte.

Für mehrere Ziele das gleiche Projekt / Code-Sharing, ich dies tun, indem Sie die C-Flaggen für mein iPad Ziel.

Mit der [myapp] -iPad Ziel als aktives Ziel gewählt, Pick-Projekt -> Bearbeiten Aktive Ziel [myapp] -iPad. Suche nach „c Flags“ und Doppelklick. Hinzufügen einer Markierung für „-D TARGET_IPAD“. Nun wird das Symbol TARGET_IPAD nur für Ihr iPad Ziel definiert werden.

Natürlich funktioniert dies nur, wenn Sie separate Ziele für das iPad und das iPhone verwenden. Wenn Sie die gleiche binäre auf beide laufen lassen, offensichtlich gibt es nichts, der Compiler für Sie tun können. (Allerdings ist die 3.2 SDK ab Ende Januar nicht einmal unterstützen Universal-Apps noch.)

(Edited;. Ich war über die Terminologie von "Universal" verwechselt apps etc)

Oder -> nur um sicher zu sein

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

ich denke, das tut

-(BOOL)isDeviceAniPad
{   
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200
  return ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad);
#endif
  return NO;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top