Je viens de passer à XCode 4.5 GM et j'ai découvert que vous pouvez désormais appliquer la taille '4 "Retina' à votre contrôleur de vue dans le storyboard.
Maintenant, si je veux créer une application qui s'exécute à la fois sur iPhone 4 et 5, bien sûr, je dois créer chaque fenêtre deux fois, mais je dois également détecter si l'utilisateur a un iPhone avec un écran de 3,5 "ou 4", puis appliquer le vue.
Comment dois-je faire ça?
Réponses:
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 .
L'écran de l'iPhone 5 a une hauteur de 568.
Vous pouvez imaginer une macro, pour simplifier tout cela:
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:
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
:Et ajoutons des macros de détection de modèle:
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: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 [email protected]), 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 laUIScreen
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 debounds
, 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:Vous pouvez adapter les macros précédentes de la manière suivante:
Et évidemment, si vous devez détecter un iPhone 6 ou 6 Plus, utilisez les tailles d'écran correspondantes.
la source
#define IS_IPHONE_5 ( [ [ UIScreen mainScreen ] bounds ].size.height == 568 )
DBL_EPSILON
n'est pas nécessaire ici, et que la==
comparaison n'échouera pas : il est seulement nécessaire de faire une comparaison en utilisant des différences de cette façon si la valeur en virgule flottante ne peut pas être exprimée en nombre exact (comme1.0/3.0*3.0
par exemple). Lisez cet article pour plus d'informations;)Testé et conçu pour toute combinaison de SDK et OS:
Rapide
Types d'iPad ajoutés. L'iPad 2 et l'iPad mini sont des iPad sans rétine. Alors que l'iPad Mini 2 et supérieur, l'iPad 3, 4, l'iPad Air, l'Air 2, l'Air 3 et l'iPad Pro 9.7 ont la même résolution logique de 1024. L'iPad Pro a une longueur maximale de 1366. Référence
Voyez-le en action https://gist.github.com/hfossli/bc93d924649de881ee2882457f14e346
Remarque: Si, par exemple, l'iPhone 6 est en mode zoom, l'interface utilisateur est une version agrandie de l'iPhone 5. Ces fonctions ne déterminent pas le type d'appareil, mais le mode d'affichage ainsi l'iPhone 5 est le résultat souhaité dans cet exemple.
Objectif c
Utilisation: http://pastie.org/9687735
Remarque: Si, par exemple, l'iPhone 6 est en mode zoom, l'interface utilisateur est une version agrandie de l'iPhone 5. Ces fonctions ne déterminent pas le type d'appareil, mais le mode d'affichage ainsi l'iPhone 5 est le résultat souhaité dans cet exemple.
la source
#define IS_RETINA ([[UIScreen mainScreen] scale] == 2.0)
qui aidera à déterminer la différence entre iPhone4 et iPhone5 et iPad Retina et non-SCREEN_MAX_LENGTH
pour obtenir 568 dans toutes les rotations sur iPhone 5.Solution vraiment simple
la source
Nous devons maintenant tenir compte des tailles d'écran de l'iPhone 6 et 6Plus. Voici une réponse mise à jour
Quelques infos utiles
la source
J'ai pris la liberté de mettre la macro de Macmade dans une fonction C, et de la nommer correctement car elle détecte la disponibilité des écrans larges et PAS nécessairement l'iPhone 5.
La macro ne détecte pas non plus l'exécution sur un iPhone 5 dans le cas où le projet n'inclut pas le [email protected] . Sans la nouvelle image par défaut, l'iPhone 5 affichera une taille d'écran 480x320 normale (en points). Ainsi, la vérification n'est pas seulement pour la disponibilité de l'écran large, mais aussi pour le mode écran large .
la source
inline
d. Ils seront également indiqués là où l'optimiseur du compilateur pense que c'est une bonne idée et où il peut savoir que c'est permis (par exemple, la fonction est dans le même module). Implémenter des trucs comme ça via une fonction peut parfois apporter une vérification de type supplémentaire.Voici nos codes, test réussi sur ios7 / ios8 pour iphone4, iphone5, ipad, iphone6, iphone6p, peu importe sur les appareils ou le simulateur:
la source
J'ai utilisé la réponse de hfossli et l'ai traduite en Swift
la source
c'est la macro de mon projet cocos2d. devrait être le même pour les autres applications.
la source
la source
Dans Swift, le projet iOS 8+ sur lequel j'aime faire une extension
UIScreen
, comme:(REMARQUE:
nativeBounds
est en pixels).Et puis le code sera comme:
Le code indique donc clairement qu'il s'agit d'une vérification de l'écran principal, et non du modèle de l'appareil.
la source
Empruntant à la réponse de Samrat Mazumdar, voici une courte méthode qui estime la taille de l'écran de l'appareil. Il fonctionne avec les derniers appareils, mais peut échouer sur les futurs (comme toutes les méthodes de devinettes). Cela deviendra également confus si l'appareil est en miroir (renvoie la taille de l'écran de l'appareil, pas la taille de l'écran en miroir)
la source
Je pense que cela devrait être bien si cette macro fonctionne dans l'appareil et le simulateur, voici la solution.
la source
J'ai trouvé que les réponses n'incluent pas de cas spécial pour les simulateurs.
la source
la source
iPhone5 = FALSE;
est inutile car la variable a déjà cette valeur si elle n'est pas modifiéela source
Se fier à la taille est faux à tant de niveaux. Et si on demandait au système?
Tiré de la meilleure façon de détecter le type de matériel, iPhone4 ou iPhone5? , réponse edzio27.
la source
De cette façon, vous pouvez détecter la famille d'appareils.
la source
Si le projet est créé à l'aide de Xcode 6, utilisez le code mentionné ci-dessous pour détecter les périphériques.
Si le projet a été créé dans Xcode 5 et ouvert dans Xcode 6, utilisez le code mentionné ci-dessous pour détecter les appareils (ce code fonctionne si aucune image de lancement pour iPhone 6,6+ n'est affectée)
Si vous utilisez toujours Xcode 5 tous ensemble, utilisez le code suivant pour détecter les appareils (l'iPhone 6 et 6+ ne sera pas détecté)
la source
Ajouter un «nouveau fichier Swift» ->
AppDelegateEx.swift
ajouter une extension à
AppDelegate
usage:
la source
Dans Swift 3, vous pouvez utiliser ma classe simple KRDeviceType.
https://github.com/ulian-onua/KRDeviceType
Il est bien documenté et prend en charge les opérateurs ==,> =, <=.
Par exemple, pour détecter si l'appareil a des limites d'iPhone 6 / 6s / 7, vous pouvez simplement utiliser la comparaison suivante:
Pour détecter si l'appareil a des limites d'iPhone 5 / 5S / SE ou antérieur (iPhone 4s), vous pouvez utiliser la comparaison suivante:
la source
Cela a été répondu une centaine de fois, mais cette solution a fonctionné le mieux pour moi et a aidé à résoudre le problème lorsque de nouveaux appareils sont introduits et que je n'ai pas de taille définie.
Aide de Swift 5:
En effet, il est facile de mémoriser les tailles en pouces d'un téléphone, comme un appareil "5,5 pouces" ou "4,7 pouces", mais il est difficile de se souvenir des tailles de pixels exactes.
Cela vous donne également la possibilité de faire quelque chose comme ceci:
La valeur par défaut: essaie d'utiliser la taille et l'échelle de l'écran pour essayer de calculer les pouces diagonaux. Dans le cas où une nouvelle taille d'appareil apparaît, il fera de son mieux pour déterminer et le code, comme le dernier exemple, devrait toujours fonctionner.
la source
utilisez le code suivant:
la source
Voici le test correct de l'appareil, sans dépendre de l'orientation
la source
Utilisé pour détecter les appareils iPhone et iPad de tous les versons.
la source
IS_RETINA
sur un iPhone 6 plus, 1x code est exécuté?@1x
là où elles devraient céder@3x
. de toute façon: comme vous êtes simplement en