¿Cómo pueden las interfaces de usuario adaptativas de Xcode 6 ser compatibles con iOS 7 y iOS 6?

137

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.

Duncan C
fuente
2
También hay un documento de Apple que describe la compatibilidad con las versiones <8
Alladinian

Respuestas:

151

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.

Jordan H
fuente
Puedo confirmar que en Beta4, la clase de tamaño Compact / Compact no se respeta en el simulador o en un dispositivo iOS 7. Sin embargo, es interesante que se respeten algunas clases de tamaño. Gracias por probar
remmah
Las pruebas para regular / regular en un dispositivo y no no responde a las personalizaciones clase de tamaño, lo único que consigue es hijos / ni con Beta 7
hokiewalrus
@hokiewalrus Acabo de comprobar con Xcode 6 beta 7 y obtengo exactamente los mismos resultados que detallé en la respuesta. Cambiar el ancho del cuadro en IB para Regular Regular se muestra correctamente en iPad con iOS 7.1.
Jordan H
3
@Joey esto no es un error; Esto es intencional. Compact-Compactno se exporta para iOS 7; Compact-Regulares. Vea mi respuesta para más detalles.
Dave DeLong
2
Debería ser la respuesta aceptada, la respuesta anterior es engañosa.
Dominic Lacaille
68

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.

Dave DeLong
fuente
Entiendo que su respuesta es que "Regular-Regular" debería funcionar en iPad iOS7. Pero no está funcionando. Lo he probado en la versión XCode6 GM. Corríjame si hubiera malinterpretado su respuesta.
Iducool
44
Parece que regular-regular solo funciona en storyboard, no xib
Boris Charpentier
@BorisCharpentier He informado un error sobre ese radar: // 18737656 , que se cerró como duplicado de abierto # 18490866
Maxim Pavlov
@BorisCharpentier, ¿encontró alguna solución para xib?
saadnib
44
@BorisCharpentier, acabo de encontrar que este problema se ha resuelto en XCode 6.1.1 :-)
saadnib
27

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/XIBsconfigurado para usar clases de tamaño se ejecutará iOS 7, el sistema operativo actualmente no las respeta size classesy 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á centrado vertically and horizontallyen 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ón iOS 8, pero no iOS 7. Confirmé este comportamiento en un iOS 7dispositivo también.

remmah
fuente
Roy, gracias por responder. Todavía no he tenido tiempo de probar esto, y lo aprecio. El presentador en ese video debería haber sido más claro. Creo que debe haber querido decir que los archivos XIB / Storyboard pueden ser leídos por iOS 6 y 7, pero sin soporte para la interfaz de usuario adaptativa. Hace que la codificación de aplicaciones que se ejecutan en iOS <8 sea problemática.
Duncan C
En efecto. Me pregunto si hay alguna documentación oficial sobre cómo admitir las clases de tamaño más nuevas y el enfoque de orientación / modismo más antiguo en el mismo Storyboard / XIB. Actualizaré la respuesta si encuentro algo.
remmah
En mi experiencia, Apple parece pensar que las versiones anteriores del sistema operativo dejan de existir tan pronto como anuncian una nueva versión. De hecho, el equipo de ingeniería parece dejar de prestar atención a una nueva versión del sistema operativo tan pronto como se lance, y comenzar a enfocar todas sus energías en la próxima versión principal. NUNCA tuve un error que envié solucionado en la versión principal actual. Ellos
Duncan C
3
Este ya no parece ser el caso con Xcode 6 beta 4. Vea la respuesta que acabo de agregar.
Jordan H
1
@Joey gracias por el aviso; He editado mi respuesta para referir a los lectores a su respuesta, así como a la de Dave.
remmah
12

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:

  • 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.

~~~~~

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!

radiovisual
fuente
Es genial que esto ahora esté documentado, ¡gracias por publicar!
Jordan H
3

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 XIBarchivos no funcionan en absoluto. Si creo un prototipo de celda en el storyboardarchivo, funciona en iOS7 como se explica en otras respuestas, sin embargo, cuando la misma celda de prototipo se mueve a XIBclases 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

ingrese la descripción de la imagen aquí

Funciona bien en el simulador iOS8 para XIB y Storyboard, y en iOS7 solo las celdas definidas en Storyboard obtienen restricciones actualizadas en iPad:

ingrese la descripción de la imagen aquí

sha
fuente
$ ^% $ ^% @ # ^ & @ #% & ^% ... y aquí estoy con muchos archivos xib e implementando en iOS 7 y 8.
TheEye
Exactamente. Estaba combinando los guiones gráficos de iPhone y iPad en uno y pensé que separar las celdas en su propio archivo XIB ayudaría :). Agradecería si puedes hacer +1 en mi respuesta.
sha
1
Estoy viendo este mismo comportamiento.
bjtitus
2

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 ~ipady con ~iphonesufijo, 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.

Jonathan Crooke
fuente
1

@lducool: en el generador de interfaces, en el inspector de identidad, cambie 'Builds For' a iOS7.1 y posterior.

Ash R
fuente
No hay diferencia en la salida.
Iducool
1

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.

Tom Major
fuente