Prima di tutto, non dovresti ricostruire tutte le tue viste per adattarle a un nuovo schermo, né usare viste diverse per schermi di dimensioni diverse.
Utilizza le funzionalità di ridimensionamento automatico di iOS, in modo che le tue visualizzazioni possano adattarsi e adattare qualsiasi dimensione dello schermo.
Non è molto difficile, leggi un po 'di documentazione a riguardo. Ti farà risparmiare un sacco di tempo.
iOS 6 offre anche nuove funzionalità al riguardo.
Assicurati di leggere il log delle modifiche dell'API iOS 6 sul sito Web degli sviluppatori Apple.
E controlla le nuove funzionalità di AutoLayout di iOS 6 .
Detto questo, se hai davvero bisogno di rilevare l'iPhone 5, puoi semplicemente fare affidamento sulle dimensioni dello schermo .
[ [ UIScreen mainScreen ] bounds ].size.height
Lo schermo dell'iPhone 5 ha un'altezza di 568.
Puoi immaginare una macro, per semplificare tutto questo:
#define IS_IPHONE_5 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
L'uso di fabs
con epsilon è qui per prevenire errori di precisione, quando si confrontano i punti fluttuanti, come sottolineato nei commenti di H2CO3.
Quindi d'ora in poi puoi usarlo nelle istruzioni if / else standard:
if( IS_IPHONE_5 )
{}
else
{}
Modifica: migliore rilevamento
Come affermato da alcune persone, questo rileva solo un widescreen , non un vero iPhone 5.
Le prossime versioni di iPod touch avranno forse anche uno schermo del genere, quindi potremmo usare un altro set di macro.
Rinominiamo la macro originale IS_WIDESCREEN
:
#define IS_WIDESCREEN ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
E aggiungiamo le macro di rilevamento del modello:
#define IS_IPHONE ( [ [ [ UIDevice currentDevice ] model ] isEqualToString: @"iPhone" ] )
#define IS_IPOD ( [ [ [ UIDevice currentDevice ] model ] isEqualToString: @"iPod touch" ] )
In questo modo, possiamo assicurarci di avere un modello di iPhone E un widescreen e possiamo ridefinire la IS_IPHONE_5
macro:
#define IS_IPHONE_5 ( IS_IPHONE && IS_WIDESCREEN )
Inoltre, come affermato da @ LearnCocos2D, queste macro non funzioneranno se l'applicazione non è ottimizzata per lo schermo dell'iPhone 5 (manca l'immagine Default-568h@2x.png), poiché le dimensioni dello schermo saranno comunque 320x480 in tale un caso.
Non penso che questo possa essere un problema, in quanto non vedo perché vorremmo rilevare un iPhone 5 in un'app non ottimizzata.
IMPORTANTE: supporto per iOS 8
Su iOS 8, la bounds
proprietà della UIScreen
classe ora riflette l' orientamento del dispositivo .
Quindi, ovviamente, il codice precedente non funzionerà immediatamente.
Per risolvere questo problema, puoi semplicemente utilizzare la nuova nativeBounds
proprietà, invece di bounds
, poiché non cambierà con l'orientamento e poiché si basa su una modalità verticale.
Nota che le dimensioni di nativeBounds
sono misurate in pixel, quindi per un iPhone 5 l'altezza sarà 1136 invece di 568.
Se scegli anche come target iOS 7 o versioni precedenti, assicurati di utilizzare il rilevamento delle funzionalità, poiché la chiamata nativeBounds
prima di iOS 8 causerà l'arresto anomalo dell'app:
if( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] )
{
/* Detect using nativeBounds - iOS 8 and greater */
}
else
{
/* Detect using bounds - iOS 7 and lower */
}
È possibile adattare le macro precedenti nel modo seguente:
#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 )
E ovviamente, se devi rilevare un iPhone 6 o 6 Plus, usa le dimensioni dello schermo corrispondenti.