En primer lugar, no debe reconstruir todas sus vistas para que se ajusten a una nueva pantalla, ni usar diferentes vistas para diferentes tamaños de pantalla.
Use las capacidades de cambio de tamaño automático de iOS, para que sus vistas puedan ajustarse y adaptarse a cualquier tamaño de pantalla.
Eso no es muy difícil, lea algo de documentación al respecto. Esto le ahorrará mucho tiempo.
iOS 6 también ofrece nuevas características al respecto.
Asegúrese de leer el registro de cambios de la API de iOS 6 en el sitio web del desarrollador de Apple.
Y compruebe las nuevas capacidades de iOS 6 AutoLayout .
Dicho esto, si realmente necesita detectar el iPhone 5, simplemente puede confiar en el tamaño de la pantalla .
[ [ UIScreen mainScreen ] bounds ].size.height
La pantalla del iPhone 5 tiene una altura de 568.
Puedes imaginar una macro para simplificar todo esto:
#define IS_IPHONE_5 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
El uso de fabs
con el épsilon está aquí para evitar errores de precisión, al comparar puntos flotantes, como se señala en los comentarios de H2CO3.
Entonces, a partir de ahora, puede usarlo en declaraciones if / else estándar:
if( IS_IPHONE_5 )
{}
else
{}
Editar - Mejor detección
Como han dicho algunas personas, esto solo detecta una pantalla panorámica , no un iPhone 5 real.
Las próximas versiones del iPod touch quizás también tengan dicha pantalla, por lo que podemos usar otro conjunto de macros.
Cambiemos el nombre de la macro original IS_WIDESCREEN
:
#define IS_WIDESCREEN ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
Y agreguemos macros de detección de modelos:
#define IS_IPHONE ( [ [ [ UIDevice currentDevice ] model ] isEqualToString: @"iPhone" ] )
#define IS_IPOD ( [ [ [ UIDevice currentDevice ] model ] isEqualToString: @"iPod touch" ] )
De esta manera, podemos asegurarnos de tener un modelo de iPhone Y una pantalla panorámica, y podemos redefinir la IS_IPHONE_5
macro:
#define IS_IPHONE_5 ( IS_IPHONE && IS_WIDESCREEN )
También tenga en cuenta que, como lo indicó @ LearnCocos2D, estas macros no funcionarán si la aplicación no está optimizada para la pantalla del iPhone 5 (falta la imagen Default-568h@2x.png), ya que el tamaño de la pantalla seguirá siendo 320x480 en un caso.
No creo que esto pueda ser un problema, ya que no veo por qué querríamos detectar un iPhone 5 en una aplicación no optimizada.
IMPORTANTE: soporte para iOS 8
En iOS 8, la bounds
propiedad de la UIScreen
clase ahora refleja la orientación del dispositivo .
Obviamente, el código anterior no funcionará de fábrica.
Para solucionar esto, simplemente puede usar la nueva nativeBounds
propiedad, en lugar de bounds
, ya que no cambiará con la orientación, y se basa en un modo vertical.
Tenga en cuenta que las dimensiones de nativeBounds
se miden en píxeles, por lo que para un iPhone 5 la altura será de 1136 en lugar de 568.
Si también está apuntando a iOS 7 o inferior, asegúrese de usar la detección de funciones, ya que llamar nativeBounds
antes de iOS 8 bloqueará su aplicación:
if( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] )
{
/* Detect using nativeBounds - iOS 8 and greater */
}
else
{
/* Detect using bounds - iOS 7 and lower */
}
Puede adaptar las macros anteriores de la siguiente manera:
#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 )
Y obviamente, si necesita detectar un iPhone 6 o 6 Plus, use los tamaños de pantalla correspondientes.