Tout d'abord, vous ne devez pas reconstruire toutes vos vues pour les adapter à un nouvel écran, ni utiliser des vues différentes pour des tailles d'écran différentes.
Utilisez le redimensionnement automatique d'iOS, de sorte que vos vues peuvent s'ajuster et s'adapter à toute taille d'écran.
Ce n'est pas très difficile, lisez quelques documents à ce sujet. Cela vous fera gagner beaucoup de temps.
iOS 6 offre également de nouvelles fonctionnalités à ce sujet.
Veillez à lire le Changements dans l'API d'iOS 6 sur le site Web des développeurs d'Apple.
Et vérifiez le nouvel iOS 6 AutoLayout capacités.
Cela dit, si vous avez vraiment besoin de détecter l'iPhone 5, vous pouvez simplement vous fier à l'outil de détection de l'iPhone. 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 ici pour éviter les erreurs de précision, lors de la comparaison de points flottants, comme indiqué dans les commentaires par H2CO3.
Donc, à partir de maintenant, vous pouvez l'utiliser dans les instructions if/else standard :
if( IS_IPHONE_5 )
{}
else
{}
Edit - Meilleure détection
Comme l'ont dit certaines personnes, cela ne fait que détecter un écran large et non un vrai iPhone 5.
Les prochaines versions de l'iPod touch disposeront peut-être aussi d'un tel écran, nous pourrons donc utiliser un autre jeu de macros.
Renommons la macro originale 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èles :
#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 d'iPhone ET un écran large, et nous pouvons redéfinir l'élément 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 (absence de l'image Default-568h@2x.png), car la taille de l'écran sera toujours de 320x480 dans ce 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
Sous iOS 8, le bounds
de l UIScreen
reflète maintenant le orientation du dispositif .
Il est donc évident que le code précédent ne fonctionnera pas tout de suite.
Afin de résoudre ce problème, vous pouvez simplement utiliser la nouvelle fonction nativeBounds
au lieu de bounds
Il ne change pas avec l'orientation, et il est basé sur un mode portrait.
Notez que les dimensions de nativeBounds
est mesurée en pixels, donc pour un iPhone 5, la hauteur sera de 1136 au lieu de 568.
Si vous visez également iOS 7 ou une version inférieure, assurez-vous d'utiliser la détection des fonctions, comme l'appellent les utilisateurs. nativeBounds
antérieures à iOS 8 feront planter 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.
2 votes
Il n'est pas nécessaire de construire chaque "fenêtre" deux fois. Seules celles qui sont censées correspondre exactement à la taille de l'écran devront être relayées. La solution semble plutôt évidente, il suffit de vérifier les dimensions de la fenêtre et d'ajouter une décision de cas basée sur la taille renvoyée.
1 votes
En gros, c'est vrai, mais je veux utiliser la taille supplémentaire de l'écran d'une manière complètement différente, comme on pourrait le faire avec un écran paysage.
0 votes
Vérifiez cette URL : stackoverflow.com/questions/4779221/
0 votes
Cette question doit-elle être mise à jour en fonction des nouveaux appareils ? Par exemple, "Comment détecter un appareil iOS par la taille de l'écran" ?
0 votes
Vérifiez ceci github.com/aleemrazzaq/ARCompactDeviceInfo