Xcode 8 UIB botones con restricciones que no aparecen

Todo solía funcionar muy bien hasta ayer. Actualicé Xcode a la versión 8.

Si no utilizo ninguna restricción, puedo ver los botones, pero cuando aplico restricción (s) a los botones desaparecen, no importa qué o cuántas restricciones (altura, espacio vertical, rastreo, etc.) aplique.

Cuando presiono los botones, actúan normalmente (los events siempre se envían, así que supongo que en realidad están ubicados allí (?)). Traté de cambiar el color del text, el color de background, (incluso agregando un nuevo button UIB) pero terminé sin suerte. No puedo ver los botones. Cuando cambio el color de background de la Centenetworking View , puedo ver este cambio en la aplicación. La parte más extraña es cuando hago clic en Debug View Hierarchy en Xcode para ver lo que está sucediendo, todo se ve bien allí; Puedo ver todos los botones ubicados como espero.

Restricciones Diseño

Prueba de la aplicación en iPhone 5 (iOS 9.3.5) y iPhone 6 (iOS 10).

Estoy usando Swift 2.3, iOS 10 y Xcode 8.

¿Esto es un error en Xcode 8? Cómo resolver este problema?

ACTUALIZAR:

Acabo de darme count de que el mismo problema de restricción ocurre también en UILabel y UIImageView. Se ven bien sin restricciones, pero cuando agrego cualquier restricción desaparecen.

Resuelto esto al forzar el layout antes de configurar cualquier propiedad relacionada con el layout como clipToBounds, etc … La parte difícil es dónde y cuándo llamar a layoutIfNeeded .

En mi caso, tengo un button UIB con restricciones horizontales, superiores y de altura. Aparentemente en Xcode 8, el título de mi button desapareció de repente. Entonces, lo suficientemente extraño apareció el título después de eliminar la restricción de altura. Este comportamiento indica un problema probablemente dentro del ciclo de layout de la vista. Necesitaba tener la restricción de altura, por lo que eliminarlo no era realmente la solución. Así que traté de llamar a layoutIfNeeded antes de establecer las restricciones, pero ningún efecto.

Genero este button en viewDidLoad en un controller a través de una class NSObject que lo maneja. La solución para mí fue forzar un layoutIfNeeded antes de llamar al método que estableceUps el button.

 - (void)viewDidLoad { [super viewDidLoad]; [self.view layoutIfNeeded]; //editBooking - NSObject class where the button gets configunetworking. [_editBooking setUpViews]; } 

Problemas relacionados: clipsToBounds hace que UIImage no se muestre en iOS10 y XCode 8

Editar:

"Creo que la initialization enlazada (0, 0, 1000, 1000) es la nueva forma en que Xcode instancia las vistas desde IB. Antes de Xcode8, las vistas se crearon con su tamaño configurado en el xib, luego cambiaron de tamaño según la pantalla justo después. Pero ahora, no hay un tamaño configurado en el documento IB, ya que el tamaño depende de la selección de su dispositivo (en la parte inferior de la pantalla) ".

Referencia: desde Xcode 8 y iOS10, las vistas no tienen el tamaño adecuado en viewDidLayoutSubviews

Desde notas de lanzamiento de Apple:

No se espera que el envío de layoutIfNeeded a una vista mueva la vista, pero en releases anteriores, si la vista tenía translateAutoresizingMaskIntoConstraints establecido en NO, y si estaba siendo posicionado por restricciones, layoutIfNeeded movería la vista para que coincida con el motor de layout antes de enviar el layout a el subtree Estos cambios corrigen este comportamiento, y la position del receptor y, generalmente, su tamaño no se verá afectada por layoutIfNeeded.

Es posible que algunos códigos existentes confíen en este comportamiento incorrecto que ahora se corrige. No hay cambios de comportamiento para los binarys vinculados antes de iOS 10, pero cuando se construye en iOS 10 es posible que necesite corregir algunas situaciones enviando -layoutIfNeeded a una vista de supervisión de la vista traduceAutoresizingMaskIntoConstraints que era el receptor anterior, o bien posicionarlo y dimensionarlo antes ( o después, según su comportamiento deseado) layoutIfNeeded.

Referencia: notas de la versión iOS10

Acabo de encontrar la solución. Lo más probable es que se trate de un error Xcode 8. También me enfrenté a este problema.

La solución es cambiar la versión Xcode en el generador de interfaces.

Pasos,

  1. Seleccione su file .xib.

  2. Abra la sección Utilidades.

  3. Seleccione "Inspector de files"

  4. En "Documentos del generador de interfaces", cambie la versión de Xcode de "Abre en" a "Xcode 7.x"

Creo que esto te ayudará.

Me estaba perdiendo el punto de establecer la class UIButton en mi class personalizada. Revisé mi class personalizada y vi que establecía el radio de la esquina en el método awakeFromNib() . Llamé a layoutIfNeeded() antes de configurar el radio de la esquina, que era la solución en mi caso.

No sé si es un error, pero lo resolví agregando self.layoutIfNeeded() en el método awakeFromNib() . Por si acaso, estoy subclassando UIButton

PERO, si no lo hace, no puede resolver el mismo problema al agregar esa línea de código (al less, no puede hacerlo en esta versión de Xcode). Usar viewDidLayoutSubviews() tampoco funciona …

Confirmó que este es un problema con XCode 8 actualmente (a partir del 19 de octubre) distribuido a través de App Store. Elimina innecesariamente un elemento <rect/> de los files Storyboard / xib.

Ninguna de las layoutIfNeeded alternativas de layoutIfNeeded funciona para mí. Terminé descargando XCode 8 Beta 3 que solucionó este problema.

Las restricciones para scrollview deberían ser: top,bottom,leading,trailing

La restricción para la vista de contenido en scrollview debería ser: top,bottom,leading,trailing,fixed height and center x(horizontally in container) inicial top,bottom,leading,trailing,fixed height and center x(horizontally in container)

Parece que Xcode 8.1 Beta 2 (8T46g) corrige el problema de tamaño de contenido 1000×1000 (y, por supuesto, los problemas de layout automático dentro de las celdas de vista de tabla / colección). Entonces, lo que funciona en Xcode 7.x funciona sin problemas en Xcode 8.1 Beta 2.