Gibt es einen speziellen Xcode Compiler-Flag, das gesetzt wird, wenn für iPad Kompilieren?
-
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
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 So könnte man einfach sagen: negativ: #define UI_USER_INTERFACE_IDIOM() ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] ? [[UIDevice currentDevice] userInterfaceIdiom] : UIUserInterfaceIdiomPhone)
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;
}