cómo - ios 8 para iphone 4 descargar
Problemas de autolayout con iOS8 con código que funciona bien en iOS7 (3)
Estoy en el medio de desarrollar una aplicación para iPhone y iPad. Es compatible con iOS6 e iOS7 y utiliza diseño automático exclusivamente.
La semana pasada, cuando Apple anunció que iOS8 estaba listo para el horario estelar, actualicé uno de mis iPhones y un iPad para iOS8. También cambié mi XCODE a la versión 6. Tengo el segundo iPhone que dejé en iOS7.
Genere nuevos ejecutables con Xcode 6 y me angustié ver que sus diseños de pantalla estaban en mal estado cuando se ejecutaban en mis dispositivos con iOS8 pero aún funcionaban bien en iOS7. Esto es cierto tanto en mis dispositivos físicos como en los emuladores de Xcode.
Me costó un montón de investigación, pero ahora tengo bastante claro qué está pasando, aunque no sé por qué.
Específicamente, ciertas operaciones de diseño automático me están fallando en iOS8 pero están bien en iOS7.
Algunos ejemplos que implican un botón que estoy colocando en una vista subyacente cuyo tamaño es igual al tamaño de la pantalla:
(1) Si solicito que el diseño automático coloque el centro horizontal del botón (CX) igual al centro horizontal de la vista subyacente, el resultado es que el centro horizontal del botón se coloca en el borde izquierdo de la vista subyacente.
(2) Si solicito el diseño automático para que el ancho del botón sea igual al 50% del ancho de la vista subyacente, no le da ningún ancho.
Puedo solucionar estos problemas de la siguiente manera:
(1) Pido que el diseño automático coloque el centro del botón igual al borde izquierdo de la vista subyacente más el 50% del ancho de la pantalla.
(2) Solicito el diseño automático para que el ancho del botón sea igual al 50% del ancho de la pantalla.
Poco a poco me estoy abriendo camino, con soluciones como estas, volviendo al código de diseño automático que funciona para mí tanto en iOS7 como en iOS8. Pero realmente me pregunto qué está pasando aquí.
Parece que el diseño automático no puede determinar el tamaño de la vista subyacente y, por lo tanto, los cálculos de diseño automático que requieren esa información fallan. Pero sí sabe dónde están los bordes superior e izquierdo de la vista para que los cálculos basados en esos datos tengan éxito.
Esta es una aplicación grande y he escrito cientos de líneas de códigos de diseño automático para iOS6 e iOS7 que funcionan perfectamente para mí.
He estado retocando e intentando cosas ahora con iOS8 durante tres días y no soy más prudente de lo que era cuando comencé.
¿Alguien tiene alguna sugerencia o pensamiento sobre cuál podría ser el problema aquí?
@robmayoff tiene una gran respuesta para esto: https://.com/a/26066992/1424669
Esencialmente, en iOS8 ya no se puede llamar a setNeedsUpdateConstraints
y setNeedsLayout
en una vista y se espera que las restricciones de las subvistas se actualicen.
Debe llamar a estos métodos en la vista cuya restricción está cambiando. Esto es retrocompatible con iOS7.
EJEMPLO:
Supongamos que tiene un ViewController con vista de self.view
y una subvista llamada containerView. containerView tiene NSLayoutConstraint
una NSLayoutConstraint
que desea cambiar (en este caso, espacio superior).
En iOS7 puedes actualizar todas las restricciones en un VC solicitando un nuevo diseño para la vista raíz:
self.containerView_TopSpace.constant = 0;
[self.view setNeedsUpdateConstraints];
[self.view setNeedsLayout];
En iOS8 necesita solicitar diseños en el contenedorView:
self.containerView_TopSpace.constant = 0;
[self.containerView setNeedsUpdateConstraints];
[self.containerView setNeedsLayout];
En mi caso, el problema estaba relacionado con las restricciones etiquetadas UIView-Encapsulated-Layout-Width
y UIView-Encapsulated-Layout-Height
. Cuando los quité, todo se comportó como si mi vista fuera de tamaño cero, con todo centrado en la esquina superior izquierda de la pantalla. Cuando los dejé, las nuevas restricciones funcionaron como se esperaba. También conservé las restricciones etiquetadas _UILayoutSupportConstraint
.
Puede encontrar útiles las respuestas a esta pregunta: las subvistas de celda UICollectionView no cambian de tamaño
En la mayoría de los casos, los trabajos en iOS7 pero no en los problemas de diseño automático de iOS 8 parecen provenir de la vista raíz que no se ha dimensionado correctamente en iOS 8, particularmente cuando establecemos tralationsAutoresizingMaskIntoConstraints en NO. Para mis puntos de vista, pude establecer el marco de la vista raíz en layoutSubviews (o el inicializador apropiado que tenga los límites correctos) y esto resolvió el problema.
self.contentView.frame = CGRectInset(self.bounds, 0, 0);
Como se muestra en la respuesta anterior, también podría hacer
self.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
y luego convierte traduceAutlasizingMaskIntoConstraints a NO antes de comenzar a configurar sus propias restricciones en el código.
Definitivamente odio que tanto de nuestro tiempo se tome con estos molestos problemas.