Tout d'abord, vous ne devez pas reconstruire toutes vos vues pour s'adapter à un nouvel écran, ni utiliser des vues différentes pour différentes tailles d'écran.
Utilisez les capacités de redimensionnement automatique d'iOS pour que vos vues puissent s'ajuster et adapter n'importe quelle taille d'écran.
Ce n'est pas très difficile, lisez quelques documents à ce sujet. Cela vous fera gagner beaucoup de temps.
iOS 6 propose également de nouvelles fonctionnalités à ce sujet.
Assurez-vous de lire le journal des modifications de l'API iOS 6 sur le site Web des développeurs Apple.
Et vérifiez les nouvelles capacités de mise en page automatique iOS 6 .
Cela dit, si vous avez vraiment besoin de détecter l'iPhone 5, vous pouvez simplement vous fier à la taille de l' écran .
[ [ UIScreen mainScreen ] bounds ].size.height
L'écran de l'iPhone 5 a une hauteur de 568.
Vous pouvez imaginer une macro, pour simplifier tout cela:
#define IS_IPHONE_5 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
L'utilisation de fabs
avec l'epsilon est là pour éviter les erreurs de précision, lors de la comparaison des virgules flottantes, comme indiqué dans les commentaires de H2CO3.
Vous pouvez donc désormais l'utiliser dans les instructions if / else standard:
if( IS_IPHONE_5 )
{}
else
{}
Modifier - Meilleure détection
Comme indiqué par certaines personnes, cela ne détecte qu'un écran large , pas un véritable iPhone 5.
Les prochaines versions de l'iPod touch auront peut-être également un tel écran, nous pouvons donc utiliser un autre ensemble de macros.
Renommons la macro d'origine IS_WIDESCREEN
:
#define IS_WIDESCREEN ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
Et ajoutons des macros de détection de modèle:
#define IS_IPHONE ( [ [ [ UIDevice currentDevice ] model ] isEqualToString: @"iPhone" ] )
#define IS_IPOD ( [ [ [ UIDevice currentDevice ] model ] isEqualToString: @"iPod touch" ] )
De cette façon, nous pouvons nous assurer que nous avons un modèle iPhone ET un écran large, et nous pouvons redéfinir la IS_IPHONE_5
macro:
#define IS_IPHONE_5 ( IS_IPHONE && IS_WIDESCREEN )
Notez également que, comme indiqué par @ LearnCocos2D, ces macros ne fonctionneront pas si l'application n'est pas optimisée pour l'écran de l'iPhone 5 (sans l'image Default-568h@2x.png), car la taille de l'écran sera toujours de 320x480 dans un tel un cas.
Je ne pense pas que cela puisse être un problème, car je ne vois pas pourquoi nous voudrions détecter un iPhone 5 dans une application non optimisée.
IMPORTANT - Prise en charge d'iOS 8
Sur iOS 8, la bounds
propriété de la UIScreen
classe reflète désormais l' orientation du périphérique .
Donc, évidemment, le code précédent ne fonctionnera pas hors de la boîte.
Pour résoudre ce problème, vous pouvez simplement utiliser la nouvelle nativeBounds
propriété, au lieu de bounds
, car elle ne changera pas avec l'orientation, et car elle est basée sur un mode portrait-up.
Notez que les dimensions de nativeBounds
sont mesurées en pixels, donc pour un iPhone 5, la hauteur sera de 1136 au lieu de 568.
Si vous ciblez également iOS 7 ou une version nativeBounds
antérieure , assurez-vous d'utiliser la détection des fonctionnalités, car les appels avant iOS 8 planteront votre application:
if( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] )
{
/* Detect using nativeBounds - iOS 8 and greater */
}
else
{
/* Detect using bounds - iOS 7 and lower */
}
Vous pouvez adapter les macros précédentes de la manière suivante:
#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 )
Et évidemment, si vous devez détecter un iPhone 6 ou 6 Plus, utilisez les tailles d'écran correspondantes.