Acabo de ver el video # 216 de WWDC, "Construyendo una interfaz de usuario adaptativa con UIKit".
Alrededor de las 45:10, Tony Ricciardi habla sobre los cambios en IB en Xcode 6 para respaldar los nuevos cambios.
Él dice "Puede implementar estos documentos al revés a versiones anteriores de iOS".
(donde "Estos documentos" presumiblemente significa XIB y guiones gráficos que tienen configuraciones específicas para diferentes clases de tamaño).
No estoy inventando esto. Ve a ver el video de la WWDC.
¿Cómo es eso posible? Las colecciones de rasgos y las clases de tamaño solo se definen en iOS 8. ¿Cómo puede funcionar el comportamiento en tiempo de ejecución que depende de las construcciones de IU que son nuevas para iOS 8 en versiones anteriores de iOS?
Si es posible, sería maravilloso. Puede crear aplicaciones que se ejecuten en iOS 6, 7 y 8, y aprovechar las nuevas capacidades de diseño de interfaz de usuario flexibles que Apple ha agregado a Xcode 6. Yo mismo he creado una lógica de interfaz de usuario adaptativa en el código, y es bastante de trabajo.
fuente
Respuestas:
Los cambios realizados en la interfaz de usuario con clases de tamaño en Interface Builder sí aparecen correctamente en dispositivos iOS 7 y la vista previa en Xcode. Por ejemplo, cambié algunas restricciones de Diseño automático y tamaños de fuente para Altura normal Ancho normal y esas restricciones cambiadas son visibles en el Simulador de iPad con iOS 7.0.
Todas las optimizaciones de clase de tamaño están disponibles para iOS 7, excepto las clases de tamaño que tienen una altura compacta. Esto ha sido confirmado por Apple y ahora se indica directamente en la documentación :
Para las aplicaciones que admiten versiones de iOS anteriores a iOS 8, la mayoría de las clases de tamaño son compatibles con versiones anteriores.
Las clases de tamaño son compatibles con versiones anteriores cuando:
- La aplicación está construida con Xcode versión 6 o posterior
- El objetivo de implementación de la aplicación es anterior a iOS 8
- Las clases de tamaño se especifican en un guión gráfico o xib
- El valor del componente de altura no es compacto
Debido a que iOS 7 no respeta un par de clases de tamaño, si las usa tendrá problemas. Por ejemplo: cuando tiene Compact w Any h definido y luego Compact w Compact h definido, en iOS 7 respetará el Compact w Any h pero en iOS 8 presentará el aspecto Compact w Compact h.
Por lo tanto, si desea utilizar esas dos clases de tamaño y mantener la compatibilidad con iOS 7, haría cualquier optimización que desee para iPhone en horizontal en Any w Any ho Compact w Any h, luego realice sus otras optimizaciones para diferentes clases de tamaño según sea necesario, y de esa manera no necesitará usar ninguna clase de tamaño con altura compacta y evitará problemas.
fuente
Compact-Compact
no se exporta para iOS 7;Compact-Regular
es. Vea mi respuesta para más detalles.Al implementar su aplicación en iOS 7, Xcode compilará su guión gráfico de dos maneras diferentes:
Para iPhone, su guión gráfico se compila como "Compacto-Regular" (ancho compacto, altura normal), y esto se empaqueta como su plumilla "~ iphone".
Para iPad, su guión gráfico se compila como "Regular-Regular" y se empaqueta como su plumilla "~ ipad".
Entonces, si está buscando implementar tanto en iOS 7 como en iOS 8, debe enfocar su diseño en las clases de tamaño Compact-Any y Regular-Any. Eso le dará la mejor experiencia en términos de igualar la interfaz de usuario en todos los objetivos de implementación. Por supuesto, puede modificar el diseño para otras clases de tamaño, pero a menos que esas modificaciones se apliquen a las clases de tamaño Compact-Regular o Regular-Regular, entonces no vería esas modificaciones en iOS 7.
fuente
Nota: Esta respuesta fue relevante para una versión beta de Xcode 6 y ya no es aplicable a la versión de envío. Consulte las respuestas de Joey y Dave DeLong en esta página para obtener información adecuada.
(respuesta original retenida a continuación):
Si bien
Storyboards/XIBs
configurado para usar clases de tamaño se ejecutaráiOS 7
, el sistema operativo actualmente no las respetasize classes
y parece usar la clase de tamaño predeterminada 'Cualquiera / Cualquiera'.Estoy de acuerdo en que la diapositiva particular a la que te refieres parece prometer tal compatibilidad, pero no parece ser el caso actualmente
(Xcode 6 beta 2)
.Para probar, creé un proyecto
(iOS 8 SDK, deployment target of 7.1)
con un solo botón que está centradovertically and horizontally
en la clase Cualquier / Cualquier tamaño, pero alineado con la esquina superior izquierda en la clase de tamaño Compacto / Compacto (por ejemplo, iPhone en horizontal). El Asistente de vista previa de Xcode muestra que el botón cambia su posicióniOS 8
, pero noiOS 7
. Confirmé este comportamiento en uniOS 7
dispositivo también.fuente
Como algunas de las respuestas y comentarios estaban discutiendo la naturaleza de la compatibilidad con versiones anteriores, pensé en compartir un extracto directo de la Documentación de Apple :
~~~~~
Implementar una aplicación con clases de tamaño en versiones anteriores de iOS
Para las aplicaciones que admiten versiones de iOS anteriores a iOS 8, la mayoría de las clases de tamaño son compatibles con versiones anteriores.
Las clases de tamaño son compatibles con versiones anteriores cuando:
~~~~~
Ese último punto está dirigido a esta discusión, donde Apple confirma que mientras no se use "altura compacta" , debe mantener la compatibilidad con versiones anteriores.
¡Espero que esto ayude a alguien!
fuente
Al tratar con un problema similar, encontré otra respuesta que aún no he visto aquí. Parece que las clases de tamaño en los
XIB
archivos no funcionan en absoluto. Si creo un prototipo de celda en elstoryboard
archivo, funciona en iOS7 como se explica en otras respuestas, sin embargo, cuando la misma celda de prototipo se mueve aXIB
clases separadas de tamaño de archivo se ignora en iOS7.Aquí hay un enlace al proyecto de muestra que demuestra este comportamiento: https://dl.dropboxusercontent.com/u/6402890/testSizeClasses.zip
En la celda prototipo tengo cuatro restricciones de cada borde de la vista gris. Cada uno de ellos está configurado de la misma manera: Cualquiera / Cualquiera - 10, Regular / Regular - 20
Funciona bien en el simulador iOS8 para XIB y Storyboard, y en iOS7 solo las celdas definidas en Storyboard obtienen restricciones actualizadas en iPad:
fuente
Si le ahorra tiempo a alguien, creo que la forma en que Xcode 6 proporciona compatibilidad casi hacia atrás para las clases de tamaño es a través de los guiones gráficos históricos
~ipad
y con~iphone
sufijo, y nada más. Esto tiene sentido ya que las clases de tamaño son una forma más abstracta de cómo definimos previamente un guión gráfico para iPad y un guión gráfico para iPhone.Por lo tanto:
Si su objetivo es utilizar clases de tamaño para admitir diseños específicos de la familia de dispositivos (iPad vs. iPhone), entonces tiene suerte: las clases de tamaño son una interfaz más agradable para el método admitido anteriormente.
Si su objetivo es utilizar clases de tamaño para admitir diseños alterados para diferentes modelos dentro de la misma familia de dispositivos, es decir. iPhone 5/6/6 + inc. paisaje, entonces no tienes suerte . El uso de estos requeriría un objetivo mínimo de implementación de iOS 8.
fuente
@lducool: en el generador de interfaces, en el inspector de identidad, cambie 'Builds For' a iOS7.1 y posterior.
fuente
Lamentablemente, las respuestas de Dave y Joey no me funcionan. No puedo comentar en este hilo, así que perdónenme si este es el lugar equivocado.
He formulado una pregunta específica para eso: Ejemplo para la interfaz de usuario adaptativa del paisaje vertical de iPhone que es compatible con iOS 7
Por lo que aprendí hasta ahora, creo que ahora, como en mi ejemplo, no es posible tener 2 restricciones diferentes y diferentes para un elemento ui en modo vertical y horizontal con iPhone iOS7 basado en clases de tamaño. Sin embargo, me alegraría si me equivoco.
fuente