Acabo de actualizar a XCode 4.5 GM y descubrí que ahora puede aplicar el tamaño '4 "Retina' a su controlador de vista en el guión gráfico.
Ahora, si quiero crear una aplicación que se ejecute en iPhone 4 y 5, por supuesto, tengo que construir cada ventana dos veces, pero también tengo que detectar si el usuario tiene un iPhone con pantalla de 3.5 "o 4" y luego aplicar el ver.
¿Cómo debo hacer eso?
Respuestas:
En primer lugar, no debe reconstruir todas sus vistas para que se ajusten a una nueva pantalla, ni usar diferentes vistas para diferentes tamaños de pantalla.
Use las capacidades de cambio de tamaño automático de iOS, para que sus vistas puedan ajustarse y adaptarse a cualquier tamaño de pantalla.
Eso no es muy difícil, lea algo de documentación al respecto. Esto le ahorrará mucho tiempo.
iOS 6 también ofrece nuevas características al respecto.
Asegúrese de leer el registro de cambios de la API de iOS 6 en el sitio web del desarrollador de Apple.
Y compruebe las nuevas capacidades de iOS 6 AutoLayout .
Dicho esto, si realmente necesita detectar el iPhone 5, simplemente puede confiar en el tamaño de la pantalla .
La pantalla del iPhone 5 tiene una altura de 568.
Puedes imaginar una macro para simplificar todo esto:
El uso de
fabs
con el épsilon está aquí para evitar errores de precisión, al comparar puntos flotantes, como se señala en los comentarios de H2CO3.Entonces, a partir de ahora, puede usarlo en declaraciones if / else estándar:
Editar - Mejor detección
Como han dicho algunas personas, esto solo detecta una pantalla panorámica , no un iPhone 5 real.
Las próximas versiones del iPod touch quizás también tengan dicha pantalla, por lo que podemos usar otro conjunto de macros.
Cambiemos el nombre de la macro original
IS_WIDESCREEN
:Y agreguemos macros de detección de modelos:
De esta manera, podemos asegurarnos de tener un modelo de iPhone Y una pantalla panorámica, y podemos redefinir la
IS_IPHONE_5
macro:También tenga en cuenta que, como lo indicó @ LearnCocos2D, estas macros no funcionarán si la aplicación no está optimizada para la pantalla del iPhone 5 (falta la imagen [email protected]), ya que el tamaño de la pantalla seguirá siendo 320x480 en un caso.
No creo que esto pueda ser un problema, ya que no veo por qué querríamos detectar un iPhone 5 en una aplicación no optimizada.
IMPORTANTE: soporte para iOS 8
En iOS 8, la
bounds
propiedad de laUIScreen
clase ahora refleja la orientación del dispositivo .Obviamente, el código anterior no funcionará de fábrica.
Para solucionar esto, simplemente puede usar la nueva
nativeBounds
propiedad, en lugar debounds
, ya que no cambiará con la orientación, y se basa en un modo vertical.Tenga en cuenta que las dimensiones de
nativeBounds
se miden en píxeles, por lo que para un iPhone 5 la altura será de 1136 en lugar de 568.Si también está apuntando a iOS 7 o inferior, asegúrese de usar la detección de funciones, ya que llamar
nativeBounds
antes de iOS 8 bloqueará su aplicación:Puede adaptar las macros anteriores de la siguiente manera:
Y obviamente, si necesita detectar un iPhone 6 o 6 Plus, use los tamaños de pantalla correspondientes.
fuente
#define IS_IPHONE_5 ( [ [ UIScreen mainScreen ] bounds ].size.height == 568 )
DBL_EPSILON
no es necesaria aquí, y que la==
comparación no fallará: solo es necesario hacer una comparación usando las diferencias de esta manera si el valor de coma flotante no puede expresarse como un número exacto (como1.0/3.0*3.0
por ejemplo). Lea este artículo para obtener más información;)Probado y diseñado para cualquier combinación de SDK y OS:
Rápido
Tipos de iPad agregados. iPad 2 y iPad mini son iPads sin retina. Mientras que el iPad Mini 2 y superior, iPad 3, 4, iPad Air, Air 2, Air 3 y iPad Pro 9.7 tienen la misma resolución lógica de 1024. iPad Pro tiene una longitud máxima de 1366. Referencia
Véalo en acción https://gist.github.com/hfossli/bc93d924649de881ee2882457f14e346
Nota: Si, por ejemplo, el iPhone 6 está en modo ampliado, la IU es una versión ampliada del iPhone 5. Estas funciones no determinan el tipo de dispositivo, pero el modo de visualización, por lo tanto, el iPhone 5 es el resultado deseado en este ejemplo.
C objetivo
Uso: http://pastie.org/9687735
Nota: Si, por ejemplo, el iPhone 6 está en modo ampliado, la IU es una versión ampliada del iPhone 5. Estas funciones no determinan el tipo de dispositivo, pero el modo de visualización, por lo tanto, el iPhone 5 es el resultado deseado en este ejemplo.
fuente
#define IS_RETINA ([[UIScreen mainScreen] scale] == 2.0)
que ayudará a determinar la diferencia entre iPhone4 y iPhone5 y iPad Retina y no retinaSCREEN_MAX_LENGTH
para obtener 568 en todas las rotaciones en el iPhone 5.Solución realmente simple
fuente
Ahora tenemos que tener en cuenta los tamaños de pantalla de iPhone 6 y 6Plus. Aquí hay una respuesta actualizada
Alguna información útil
fuente
Me tomé la libertad de poner la macro de Macmade en una función C y nombrarla correctamente porque detecta la disponibilidad de pantalla panorámica y NO necesariamente el iPhone 5.
La macro tampoco detecta la ejecución en un iPhone 5 en caso de que el proyecto no incluya [email protected] . Sin la nueva imagen predeterminada, el iPhone 5 informará un tamaño de pantalla normal de 480x320 (en puntos). Por lo tanto, la comprobación no es solo para la disponibilidad de pantalla panorámica, sino también para habilitar el modo de pantalla panorámica .
fuente
inline
d. También estarán en línea donde el optimizador del compilador cree que es una buena idea y donde puede saber que está permitido (por ejemplo, la función está en el mismo módulo). Implementar cosas como esta a través de una función a veces puede traer verificación de tipo adicional.Aquí están nuestros códigos, prueba aprobada en ios7 / ios8 para iphone4, iphone5, ipad, iphone6, iphone6p, no importa en dispositivos o simulador:
fuente
Usé la respuesta de hfossli y la traduje a Swift
fuente
Esta es la macro para mi proyecto cocos2d. debería ser igual para otras aplicaciones.
fuente
fuente
En Swift, proyecto iOS 8+ en el que me gusta hacer una extensión
UIScreen
, como:(NOTA:
nativeBounds
está en píxeles).Y luego el código será como:
Entonces, el código deja en claro que esta es una verificación para la pantalla principal, no para el modelo de dispositivo.
fuente
Tomando prestado de la respuesta de Samrat Mazumdar, aquí hay un método corto que estima el tamaño de la pantalla del dispositivo. Funciona con los dispositivos más recientes, pero puede fallar en los futuros (como podrían hacer todos los métodos de adivinanzas). También se confundirá si el dispositivo se está duplicando (devuelve el tamaño de la pantalla del dispositivo, no el tamaño de la pantalla reflejada)
fuente
Creo que debería ser bueno si esta macro funcionará en el dispositivo y el simulador, a continuación se encuentra la solución.
fuente
Descubrí que las respuestas no incluyen un caso especial para Simuladores.
fuente
fuente
iPhone5 = FALSE;
es innecesaria porque la variable tiene ya ese valor si no ha cambiadofuente
Confiar en el tamaño está mal en muchos niveles. ¿Qué tal si le preguntamos al sistema?
¿Tomado de la mejor manera de detectar el tipo de hardware, iPhone4 o iPhone5? , edzio27 respuesta.
fuente
De esta manera puede detectar la familia de dispositivos.
fuente
Si el proyecto se crea utilizando Xcode 6, utilice el código mencionado a continuación para detectar los dispositivos.
Si el proyecto se creó en Xcode 5 y se abrió en Xcode 6, utilice el código mencionado a continuación para detectar los dispositivos (este código funciona si no se asignan imágenes de lanzamiento para iPhone 6,6+)
Si todavía usa Xcode 5 todos juntos, use el siguiente código para detectar los dispositivos (no se detectarán iPhone 6 y 6+)
fuente
Agregue un 'Nuevo archivo Swift' ->
AppDelegateEx.swift
agregar una extensión a
AppDelegate
uso:
fuente
En Swift 3 puedes usar mi clase simple KRDeviceType.
https://github.com/ulian-onua/KRDeviceType
Está bien documentado y admite operadores ==,> =, <=.
Por ejemplo, para detectar si el dispositivo tiene límites de iPhone 6 / 6s / 7, puede usar la siguiente comparación:
Para detectar si el dispositivo tiene límites de iPhone 5 / 5S / SE o anterior (iPhone 4s), puede usar la siguiente comparación:
fuente
Esto ha sido respondido cientos de veces, pero esta solución funcionó mejor para mí y me ayudó a resolver el problema cuando se introducen nuevos dispositivos y no tengo un tamaño definido.
Ayudante de Swift 5:
Esto se debe a que es fácil memorizar los tamaños en pulgadas de un teléfono, como un dispositivo de "5.5 pulgadas" o "4.7 pulgadas", pero es difícil recordar los tamaños de píxeles exactos.
Esto también te da la oportunidad de hacer algo como esto:
El valor predeterminado: intenta usar el tamaño y la escala de la pantalla para tratar de calcular las pulgadas diagonales. Esto es en caso de que aparezca un nuevo tamaño de dispositivo, hará todo lo posible para determinarlo y el código, como el último ejemplo, debería funcionar.
fuente
use el siguiente código:
fuente
Aquí está la prueba correcta del dispositivo, sin depender de la orientación
fuente
Se utiliza para detectar dispositivos iPhone y iPad de todos los versons.
fuente
IS_RETINA
en un iPhone 6 plus, ¿se ejecuta el código 1x?@1x
, donde deberían ceder@3x
. de todos modos: como estás simplemente copiando y pegando: -1