Comment détecter l'iPhone 5 (grand écran des appareils)?
J'ai juste mis à niveau vers XCode 4.5 GM et a découvert que vous pouvez maintenant appliquer le "4" Retina " taille de votre vue-contrôleur dans le storyboard.
Maintenant, si je veux créer une application qui fonctionne aussi bien sur iPhone 4 et 5, bien sûr, j'ai de construire chaque fenêtre à deux reprises, mais j'ai aussi de détecter si l'utilisateur a un iPhone avec 3.5" ou 4" écran et ensuite appliquer la vue.
Comment dois-je faire?
- Vous n'avez pas à construire chaque "fenêtre" à deux reprises. Seuls ceux qui sont censés correspondre exactement à la taille de l'écran devra être relayouted. La solution semble assez évident, il suffit de vérifier les dimensions de la fenêtre et ajouter un cas de décision basée sur le retour de la taille.
- Eh bien, fondamentalement, c'est vrai, mais je veux utiliser le supplément de la taille de l'écran dans une manière complètement différente, comme vous pourriez le faire avec un écran paysage.
- Cochez cette URL: stackoverflow.com/questions/4779221/...
- Cette question devrait-elle être mise à jour en conformité avec les nouveaux appareils? E. g. "Comment détecter un appareil iOS par la taille de l'écran"?
- cochez cette github.com/aleemrazzaq/ARCompactDeviceInfo
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, vous ne devriez pas reconstruire tous vos points de vue pour s'adapter à un nouvel écran, ni utiliser des points de vue différents pour les différentes tailles d'écran.
Utiliser le auto-redimensionnement capacités d'iOS, donc, votre point de vue peut s'ajuster et de s'adapter à toute taille d'écran.
Ce n'est pas très dur, lire une partie de la documentation à ce sujet. Il vous permettra d'économiser beaucoup de temps.
iOS 6 offre également de nouvelles fonctionnalités à ce sujet.
Assurez-vous de lire les iOS 6 API changelog sur le site des Développeurs d'Apple.
Et vérifier le nouvel iOS 6 mise en page automatique capacités.
Cela dit, si vous avez vraiment besoin pour détecter l'iPhone 5, vous pouvez simplement compter sur le taille de l'écran.
L'iPhone 5 l'écran a une taille de 568.
Vous pouvez imaginer une macro, pour simplifier tout cela:
L'utilisation de
fabs
avec l'epsilon est ici d'éviter des erreurs de précision, lorsque l'on compare les floating points, comme indiqué dans les commentaires par H2CO3.Donc à partir de maintenant vous pouvez l'utiliser en standard if/else:
Edit - Meilleure détection
Comme indiqué par certaines personnes, ce n' détecter un grand écran, pas un iPhone 5.
Les prochaines versions de l'iPod touch sera peut-être aussi avoir un écran de ce type, alors nous pouvons utiliser un autre ensemble de macros.
Nous allons renommer la macro d'origine
IS_WIDESCREEN
:Et nous allons ajouter un modèle de détection des macros:
De cette façon, nous pouvons nous assurer que nous avons un modèle d'iPhone ET un grand écran, et on peut redéfinir la
IS_IPHONE_5
macro:À noter également que, comme l'a indiqué @LearnCocos2D, cette macros ne fonctionnent pas si l'application n'est pas optimisée pour l'iPhone 5 écran (manque le [email protected] de l'image), comme la taille de l'écran sera toujours 320x480 dans un tel cas.
Je ne pense pas que cela peut être un problème, car je ne vois pas pourquoi on aurait envie de détecter un iPhone 5 dans un non-optimisé app.
IMPORTANT - iOS 8 support
Sur iOS 8, la
bounds
propriété de laUIScreen
classe reflète désormais la orientation du périphérique.Alors, évidemment, le code précédent ne fonctionne pas hors de la boîte.
Afin de résoudre ce problème, vous pouvez simplement utiliser la nouvelle
nativeBounds
propriété, au lieu debounds
, comme elle ne change pas avec l'orientation, et comme il est basé sur un portrait-mode.À noter que les dimensions de
nativeBounds
est mesurée en pixels, de sorte que pour un iPhone 5 de la hauteur seront 1136 au lieu de 568.Si vous êtes également le ciblage iOS 7 ou plus bas, assurez-vous d'utiliser la fonctionnalité de détection, comme l'appel à
nativeBounds
avant iOS 8 va se planter votre application:Vous pouvez adapter la précédente macros de la manière suivante:
Et évidemment, si vous avez besoin de détecter un iPhone 6 ou 6 Plus, utilisez les différentes tailles d'écran.
#define IS_IPHONE_5 ( [ [ UIScreen mainScreen ] bounds ].size.height == 568 )
height > 500
à la place?height > 500
ne fonctionnera que si vous ne disposez pas d'une application universelle, sinon, vous aurez également à détecter le modèle à l'aide deUIDevice
pour voir si c'est un iPhone ou un iPad.==
. Ce qui est pratique c'est qu'il y a l'iPhone/iPad limite entre 568 et 768. Donc, fondamentalement, vous pouvez utiliser 3 contrôles:if (h < 500) { iPhone <= 4S } else if (h < 600) { iPhone 5 } else { iPad }
.DBL_EPSILON
n'est pas nécessaire ici, et que le==
comparaison pas fail: il est seulement nécessaire de faire de comparaison en utilisant les différences de cette façon, si la valeur à virgule flottante ne peut pas être exprimé comme un nombre exact (comme1.0/3.0*3.0
par exemple). Lire cet article pour plus d'infos 😉double
:#define IS_IPHONE_5 ( (double)([ [ UIScreen mainScreen ] bounds ].size.height) == (double) 568 )
Et les deux côtés sont 568 représenté en double et il ne devrait pas échouer#define IS_IPHONE_5 ( (int)([ [ UIScreen mainScreen ] bounds ].size.height) == 568 )
? Vous s'attendre à l'écran principal de limites à toujours être équivalent à une valeur entière de toute façon...(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
et(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
...depuis l'iPhone 5 est à bien des égards un nouveau périphérique à la conception. Je viens de découvrir il n'y a pas de prolongation automatique pour qu'il soit (comme @2x etc.) Mais bon, nous pouvons créer ces choses nous-mêmes, même si elles seront moins jolie qu'une solution native!-568h
pour le nom de fichier.Testé et conçu pour toute combinaison de SDK et OS:
Swift
Ajouté iPad types. l'iPad 2 et l'iPad mini non retina ipad. Alors que l'iPad Mini 2 & au-dessus, iPad 3, 4, iPad Air, Air 2, Air 3, et de l'iPad Pro 9.7 ont même logique de résolution de 1024. iPad Pro a maxLength 1366. Référence
De les voir en action
https://gist.github.com/hfossli/bc93d924649de881ee2882457f14e346
Remarque: Si par exemple, l'iPhone 6 est en zoom le mode de l'INTERFACE utilisateur est un zoom de la version de l'iPhone 5. Ces fonctions n'est pas de déterminer le type d'appareil, mais le mode d'affichage ainsi, l'iPhone 5 est le résultat souhaité dans cet exemple.
Objective-C
Utilisation: http://pastie.org/9687735
Remarque: Si par exemple, l'iPhone 6 est en zoom le mode de l'INTERFACE utilisateur est un zoom de la version de l'iPhone 5. Ces fonctions n'est pas de déterminer le type d'appareil, mais le mode d'affichage ainsi, l'iPhone 5 est le résultat souhaité dans cet exemple.
#define IS_RETINA ([[UIScreen mainScreen] scale] == 2.0)
qui aidera à déterminer la différence entre les deux iPhone4 et iPhone5 et iPad Retina et non-retina#define IS_WIDESCREEN ([[UIScreen mainScreen] bounds].size.height == 568)
et puis:#define IS_IPHONE_5 (IS_IPHONE && IS_WIDESCREEN)
SCREEN_MAX_LENGTH
pour obtenir 568 dans tous les rotations sur l'iPhone 5.#define IS_IPAD_PRO (IS_IPAD && SCREEN_MAX_LENGTH == 1366.0)
🙂Vraiment de solution simple
Nous avons maintenant besoin de compte pour l'iPhone 6 et 6Plus tailles d'écran. Voici une mise à jour de réponse
Quelques infos utiles
J'ai pris la liberté de mettre la macro par Macmade dans une fonction C, et le nom correctement, car il détecte écran large disponibilité et PAS nécessairement l'iPhone 5.
La macro aussi ne détecte pas en cours d'exécution sur un iPhone 5 dans le cas où le projet n'inclut pas les [email protected]. Sans la nouvelle image par Défaut, l'iPhone 5 rapport régulier 480x320 taille de l'écran (en points). Si la case n'est pas seulement pour le grand écran de la disponibilité mais pour mode écran est activé ainsi.
inline
d. Ils vont aussi être incorporé où compilateur optimiseur pense que c'est une bonne idée, et où il peut savoir que c'est possible (par exemple, la fonction est dans le même module). La mise en œuvre des trucs de ce genre au travers d'une fonction peut parfois apporter plus de la vérification de type.Voici nos codes, test réussi sur ios7/ios8 pour iphone4,iphone5,ipad,iphone6,iphone6p, pas de question sur les dispositifs ou simulateur:
J'ai utilisé hfossli réponse et traduit pour Swift
c'est la macro pour mon cocos2d projet. doit être la même pour d'autres applications.
Dans Swift, iOS 8+ projet que je tiens à faire une extension sur
UIScreen
, comme:(NOTE:
nativeBounds
est en pixels).Et puis le code sera comme:
De sorte que le code précise que c'est un chèque de l'écran principal, pas pour le modèle de l'appareil.
Emprunt de Samrat Mazumdar réponse, voici une petite méthode qui estime que le dispositif de la taille de l'écran. Il fonctionne avec les appareils les plus récents, mais peut échouer sur celles à venir (comme toutes les méthodes de deviner pourrait). Il sera également se confondre si l'appareil est mis en miroir (renvoie l'appareil de la taille de l'écran, pas le miroir de la taille de l'écran)
Je pense que ça devrait être bon si cette macro va travailler dans l'appareil et sur simulateur, ci-dessous sont la solution.
J'ai trouvé que les réponses ne comprennent pas un cas particulier pour les Simulateurs.
iPhone5 = FALSE;
est inutile parce que la variable a déjà cette valeur, si elle n'est pas changéEn invoquant la taille est faux à bien des niveaux. Que diriez-vous de demander au système?
Prises de Le meilleur moyen de détecter le type de matériel, iPhone4 ou iPhone5?, edzio27 réponse.
De cette façon, vous pouvez détecter l'appareil de la famille.
Si le projet est créé à l'aide de Xcode 6, puis l'utilisation mentionnées ci-dessous de code pour détecter les périphériques..
Si le projet a été créé dans Xcode 5 et ouvert dans Xcode 6, puis l'utilisation mentionnées ci-dessous de code pour détecter les périphériques.(Ce code fonctionne si pas de lancer des images pour iPhone 6,6+ sont affectés)
Si vous êtes toujours à l'aide de Xcode 5 tous ensemble, puis utiliser le code suivant pour détecter les appareils (iPhone 6 et 6+ ne sera pas détecté)
Ajouter une Nouvelle Swift Fichier'->
AppDelegateEx.swift
ajouter une extension à
AppDelegate
utilisation:
Ce qui a été répondu à une centaine de fois, mais cette solution a fonctionné le mieux pour moi. C'est une simple fonction d'assistance et ne nécessite pas l'extension d'un système de classe.
Swift 3 Helper:
C'est parce qu'il est facile à mémoriser un téléphone pouces, comme, "de 5,5 pouces" ou "de 4,7 pouces" de l'appareil, mais difficile de savoir exactement la taille de pixel.
Cela vous donne aussi l'opportunité de faire quelque chose comme ceci:
La "valeur par défaut" permet de s'assurer que votre code sera toujours de secours d'un coffre-fort de la taille si Apple sort un nouvel appareil de la taille et vous n'avez pas mis à jour votre application encore.
Noter que c'est spécifique pour des applications de téléphone, aura besoin de quelques changements pour universelles.
Dans Swift 3, vous pouvez utiliser ma classe simple KRDeviceType.
https://github.com/ulian-onua/KRDeviceType
Bien documenté et prend en charge les opérateurs ==, >=, <=.
Par exemple pour détecter si l'appareil a des limites de l'iPhone 6/6s/7, vous pouvez utiliser seulement à côté de comparaison:
Pour détecter si l'appareil a des limites de l'iPhone 5/5S/SE ou plus tôt (iPhone 4s), vous pouvez utiliser la prochaine comparaison:
utiliser le Code suivant:
Voici le test correct de l'appareil, sans en fonction de l'orientation
Utilisé pour détecter l'iPhone et l'iPad d'Appareils de toutes les versions.
IS_RETINA
sur un iPhone 6 plus, 1x code est exécuté?@1x
, où il devrait rendement@3x
. de toute façon: que vous êtes tout simplement copier&collage: -1