Problemas de layout automático de la guía de layout superior de iOS 8

Una de las pantallas de mi aplicación rompió por completo al actualizar el iOS 8 SDK. El problema parece ser que la guía de layout superior se desplaza en lugar de ser un "ancla" para el rest de las vistas.

Esto es lo que parecía la vista en iOS 7:

Pantalla iOS 7

Esto es lo que parece en iOS 8 (capturado desde el depurador Xcode 6 View Hierarchy):

Pantalla iOS 7

Como puede ver, la vista aparece muy por encima de la barra de navigation. Hay dos restricciones en la guía de layout superior, una para la vista de image superior y otra para la vista en blanco debajo. No hay restricciones en la guía de layout inferior, solo las restricciones de altura en las vistas.

Por alguna razón, iOS 8 decide empujar la guía de layout superior a {0 -255; 0 0} {0 -255; 0 0} después de que se [self.view layoutIfNeeded] por primera vez. Además, los límites de la vista a veces parecen demasiado grandes para el dispositivo (es decir, aparecen exactamente como en el storyboard unificado (600×600), en lugar de 320×480 / 320×568.

¿Qué ha cambiado en iOS 8 que podría arruinar el layout?

[EDIT] Aquí hay una list completa de las restricciones en la vista:

 (lldb) po self.view.constraints <__NSArrayM 0x786ac520>( <NSLayoutConstraint:0x7c377bd0 V:[_UILayoutGuide:0x7c372f60]-(0)-[UIView:0x7c373120]>, <NSLayoutConstraint:0x7c377c00 UIView:0x7c373120.width == UIView:0x7c3730b0.width>, <NSLayoutConstraint:0x7c377c30 UIView:0x7c3730b0.centerX == UIView:0x7c373120.centerX>, <NSLayoutConstraint:0x7c377c60 H:|-(0)-[UIView:0x7c3716f0] (Names: '|':UIView:0x7c3730b0 )>, <NSLayoutConstraint:0x7c377c90 UIView:0x7c3716f0.width == UIView:0x7c3730b0.width>, <NSLayoutConstraint:0x7c372f30 V:[_UILayoutGuide:0x7c372f60]-(129)-[UIView:0x7c3716f0]> ) 

Extend Edges > Under Top Bars está marcado de manera pnetworkingeterminada en la sección Extender bordes del inspector de attributes.

Intente desmarcar Under Top Bars .

Esto me ha ayudado muchas veces cuando tuve un comportamiento extraño como este.

Tenga en count que es una propiedad de UIViewController, por lo que puede configurarlo en el código si lo desea.

En la opción Barras superiores en Interface Builder

Puede usar UIBarPositionTopAttached o puede usar límites y frameworks de vista, también puedo sugerirle y vincularlo con la documentation de Apple que tomaría algún time para resolver el problema.

La mejor y la forma más fácil de resolver este problema es simplemente incrustar su controller de vista dentro de un controller de navigation y eso es todo. Puede hacerlo simplemente seleccionando el controller de vista yendo a Editor> Incrustar> Controlador de navigation. (Si hay algún contenido en su barra de navigation anterior, primero puede arrastrarlo hacia abajo, incrustar el controller de vista en el controller de navigation y luego mover los botones de barra en la nueva barra de navigation y luego eliminar la barra de navigation anterior)

O

Establezca la propiedad translucent la barra de navigation en NO :

 self.navigationController.navigationBar.translucent = NO; 

Esto solucionará que la vista se enmarque debajo de la barra de navigation y la barra de estado.

Si tiene que mostrar y ocultar la barra de navigation, use

  if ([self respondsToSelector:@selector(edgesForExtendedLayout)]) self.edgesForExtendedLayout = UIRectEdgeNone; // iOS 7 specific 

en su método viewDidLoad .

Espero que cualquiera de estos solucione tu problema.

Estoy usando Xcode 6.3.1 y parece que el error está de vuelta en esa versión (supuestamente fue corregido en 5.1). No pude encontrar un work-around en SO, así que tuve que search un poco más y aquí está:

en lugar de hacer la habitual Ctrl + arrastre en IB, simplemente select la Vista para la que desea hacer esto y vaya a Editor -> Pin -> Espacio superior a Superview.

Aquí está la fuente: LINK Me ayudó en mi caso.

También tiene un problema como ese. Si se ejecuta solo en iOS8, puede cambiar las restricciones de "topLayoutGuide.bottom-myView.top" a "topLayoutGuide.top-myView.top". Pero eso romperá la interfaz de usuario para iOS7. Es posible escribir una solución similar a la del código para admitir ambas versiones, pero no hay ninguna posibilidad de hacer que la interfaz de usuario funcione bien para ambas versiones cuando se crea una interfaz de usuario en storyboards.

En lugar de utilizar el guión gráfico unificado (600×600), debe mantener una de las resoluciones del dispositivo para el creador de la interfaz y luego diseñar su pantalla en IB.

Si el tamaño del controller de vista es de 600×600 en el guión gráfico, entonces en viewDidLoad, obtendrá ese marco para la vista del controller de vista y diseñará las subvistas en consecuencia.

Espero que esto ayude..