Primeiro, você não deve reconstruir todas as suas visualizações para caber em uma nova tela, nem usar diferentes visualizações para diferentes tamanhos de tela.
Use o redimensionamento automático recursos de do iOS, para que suas visualizações possam ajustar e adaptar qualquer tamanho de tela.
Isso não é muito difícil, leia alguma documentação sobre isso. Isso economizará muito tempo.
O iOS 6 também oferece novos recursos sobre isso.
Certifique-se de ler o log de alterações da API do iOS 6 no site da Apple Developer.
E verifique os novos recursos do iOS 6 AutoLayout .
Dito isto, se você realmente precisa detectar o iPhone 5, pode simplesmente confiar no tamanho da tela .
[ [ UIScreen mainScreen ] bounds ].size.height
A tela do iPhone 5 tem uma altura de 568.
Você pode imaginar uma macro para simplificar tudo isso:
#define IS_IPHONE_5 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
O uso de fabs
com o epsilon está aqui para evitar erros de precisão ao comparar pontos flutuantes, conforme apontado nos comentários de H2CO3.
Portanto, a partir de agora você pode usá-lo nas instruções if / else padrão:
if( IS_IPHONE_5 )
{}
else
{}
Editar - Melhor detecção
Como afirmado por algumas pessoas, isso se limita a detectar uma widescreen , não um iPhone 5 real.
As próximas versões do iPod touch talvez também tenham essa tela, para que possamos usar outro conjunto de macros.
Vamos renomear a macro original IS_WIDESCREEN
:
#define IS_WIDESCREEN ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
E vamos adicionar macros de detecção de modelo:
#define IS_IPHONE ( [ [ [ UIDevice currentDevice ] model ] isEqualToString: @"iPhone" ] )
#define IS_IPOD ( [ [ [ UIDevice currentDevice ] model ] isEqualToString: @"iPod touch" ] )
Dessa forma, podemos garantir que temos um modelo de iPhone E uma tela widescreen e podemos redefinir a IS_IPHONE_5
macro:
#define IS_IPHONE_5 ( IS_IPHONE && IS_WIDESCREEN )
Observe também que, conforme declarado pelo @ LearnCocos2D, essas macros não funcionarão se o aplicativo não for otimizado para a tela do iPhone 5 (sem a imagem Default-568h@2x.png), pois o tamanho da tela ainda será 320x480. um caso.
Eu não acho que isso possa ser um problema, pois não vejo por que queremos detectar um iPhone 5 em um aplicativo não otimizado.
IMPORTANTE - suporte para iOS 8
No iOS 8, a bounds
propriedade da UIScreen
classe agora reflete a orientação do dispositivo .
Então, obviamente, o código anterior não funcionará imediatamente.
Para corrigir isso, você pode simplesmente usar a nova nativeBounds
propriedade, em vez de bounds
, pois ela não muda com a orientação e como se baseia no modo de retrato.
Observe que as dimensões de nativeBounds
são medidas em pixels; portanto, para um iPhone 5, a altura será 1136 em vez de 568.
Se você também está segmentando o iOS 7 ou inferior, use a detecção de recursos, pois as chamadas nativeBounds
anteriores ao iOS 8 causam um travamento no aplicativo:
if( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] )
{
/* Detect using nativeBounds - iOS 8 and greater */
}
else
{
/* Detect using bounds - iOS 7 and lower */
}
Você pode adaptar as macros anteriores da seguinte maneira:
#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, obviamente, se você precisar detectar um iPhone 6 ou 6 Plus, use os tamanhos de tela correspondentes.