Zunächst sollten Sie nicht alle Ihre Ansichten neu erstellen, um sie an einen neuen Bildschirm anzupassen, und auch keine unterschiedlichen Ansichten für unterschiedliche Bildschirmgrößen verwenden.
Verwenden Sie die automatischen Größenänderung von iOS, damit Ihre Ansichten angepasst und jede Bildschirmgröße angepasst werden kann.
Das ist nicht sehr schwer zu lesen einige Dokumentationen darüber. Das spart Ihnen viel Zeit.
iOS 6 bietet dazu auch neue Funktionen.
Lesen Sie unbedingt das iOS 6 API-Änderungsprotokoll auf der Apple Developer-Website.
Und überprüfen Sie das neue iOS 6 AutoLayout Funktionen für .
Wenn Sie das iPhone 5 jedoch wirklich erkennen müssen, können Sie sich einfach auf die Bildschirmgröße verlassen .
[ [ UIScreen mainScreen ] bounds ].size.height
Der Bildschirm des iPhone 5 hat eine Höhe von 568.
Sie können sich ein Makro vorstellen, um all dies zu vereinfachen:
#define IS_IPHONE_5 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
Die Verwendung von fabs
mit dem Epsilon dient dazu, Präzisionsfehler beim Vergleich von Gleitkommawerten zu vermeiden, wie in den Kommentaren von H2CO3 angegeben.
Von nun an können Sie es in Standard-if / else-Anweisungen verwenden:
if( IS_IPHONE_5 )
{}
else
{}
Bearbeiten - Bessere Erkennung
Wie von einigen Leuten angegeben, tut dies nur einen Breitbildschirm , kein tatsächliches iPhone 5.
Die nächsten Versionen des iPod touch verfügen möglicherweise auch über einen solchen Bildschirm, sodass wir möglicherweise andere Makros verwenden.
Benennen wir das ursprüngliche Makro um IS_WIDESCREEN
:
#define IS_WIDESCREEN ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
Und lassen Sie uns Modellerkennungsmakros hinzufügen:
#define IS_IPHONE ( [ [ [ UIDevice currentDevice ] model ] isEqualToString: @"iPhone" ] )
#define IS_IPOD ( [ [ [ UIDevice currentDevice ] model ] isEqualToString: @"iPod touch" ] )
Auf diese Weise können wir sicherstellen, dass wir ein iPhone-Modell UND einen Breitbildmodus haben, und wir können das IS_IPHONE_5
Makro neu definieren :
#define IS_IPHONE_5 ( IS_IPHONE && IS_WIDESCREEN )
Beachten Sie auch, dass diese Makros, wie von @ LearnCocos2D angegeben, nicht funktionieren, wenn die Anwendung nicht für den iPhone 5-Bildschirm optimiert ist (ohne das Bild Default-568h@2x.png), da die Bildschirmgröße in solchen Fällen immer noch 320 x 480 beträgt ein Fall.
Ich denke nicht, dass dies ein Problem sein könnte, da ich nicht verstehe, warum wir ein iPhone 5 in einer nicht optimierten App erkennen möchten.
WICHTIG - iOS 8-Unterstützung
Unter iOS 8 spiegelt die bounds
Eigenschaft der UIScreen
Klasse jetzt die Geräteorientierung wider .
Der vorherige Code funktioniert also offensichtlich nicht sofort.
Um dies zu beheben, können Sie nativeBounds
stattdessen einfach die neue Eigenschaft verwenden bounds
, da sie sich nicht mit der Ausrichtung ändert und auf einem Hochformat basiert.
Beachten Sie, dass die Abmessungen von nativeBounds
in Pixel gemessen werden. Für ein iPhone 5 beträgt die Höhe 1136 statt 568.
Wenn Sie auch auf iOS 7 oder niedriger abzielen, stellen Sie sicher, dass Sie die Funktionserkennung verwenden, da Anrufe nativeBounds
vor iOS 8 Ihre App zum Absturz bringen:
if( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] )
{
/* Detect using nativeBounds - iOS 8 and greater */
}
else
{
/* Detect using bounds - iOS 7 and lower */
}
Sie können die vorherigen Makros folgendermaßen anpassen:
#define IS_WIDESCREEN_IOS7 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
#define IS_WIDESCREEN_IOS8 ( fabs( ( double )[ [ UIScreen mainScreen ] nativeBounds ].size.height - ( double )1136 ) < DBL_EPSILON )
#define IS_WIDESCREEN ( ( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] ) ? IS_WIDESCREEN_IOS8 : IS_WIDESCREEN_IOS7 )
Wenn Sie ein iPhone 6 oder 6 Plus erkennen müssen, verwenden Sie natürlich die entsprechenden Bildschirmgrößen.