Incapaz de satisfacer simultáneamente las restricciones – Sin restricciones en el lugar

He revisado y eliminado cada restricción de usuario, pero sigo recibiendo el siguiente error SOLAMENTE después de rotar el dispositivo. Sin embargo, no tengo ni idea de por qué. ¿Alguien tiene alguna idea?

2013-01-14 21:30:31.363 myApp[35869:c07] Unable to simultaneously satisfy constraints. Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) ( "<NSAutoresizingMaskLayoutConstraint:0x84543d0 h=--& v=--& V:[UIView:0xa330270(768)]>", "<NSLayoutConstraint:0xa338350 V:[UIView:0xa331260]-(-1)-| (Names: '|':UIView:0xa330270 )>", "<NSLayoutConstraint:0xa338390 V:|-(841)-[UIView:0xa331260] (Names: '|':UIView:0xa330270 )>" ) Will attempt to recover by breaking constraint <NSLayoutConstraint:0xa338350 V:[UIView:0xa331260]-(-1)-| (Names: '|':UIView:0xa330270 )> Break on objc_exception_throw to catch this in the debugger. The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful. 

Veamos estos uno por uno.

"<NSAutoresizingMaskLayoutConstraint:0x84543d0 h=--& v=--& V:[UIView:0xa330270(768)]>"

Esto es decir que la vista 0xa330270 ( A ) debe tener 768 puntos de alto.

"<NSLayoutConstraint:0xa338350 V:[UIView:0xa331260]-(-1)-| (Names: '|':UIView:0xa330270 )>"

Esto es decir que el borde inferior de la vista 0xa331260 ( B ) debe ser un espacio de -1 desde la parte inferior de A , que es su supervisión.

"<NSLayoutConstraint:0xa338390 V:|-(841)-[UIView:0xa331260] (Names: '|':UIView:0xa330270 )>"

Esto está diciendo que el borde superior de B debe ser un espacio de 841 puntos desde la parte superior de su supervisión, A.

Estas tres cosas no pueden ser verdaderas: A no puede tener 768 puntos de alto y contener una subvista con un borde superior 841 puntos insertados desde la parte superior e -1 puntos insertados desde la parte inferior. ¿Dónde has definido cada una de estas restricciones?

No ha dicho qué layout está intentando lograr, pero parece que podría tener una máscara de autorrealización en la supervisión que impida que cambie de altura cuando gire el dispositivo. Por lo que sé, las restricciones de autoresificación solo aparecen si ha agregado vistas de forma programática, ya que un guión gráfico o xib es una reproducción automática o no. A less que esté haciendo algo así como agregar una vista desplegada automática (cargada desde una punta) a otra vista desde una punta que no sea de autoajuste?

Creo que este no es un error común, pero lo resolví un poco de manera profana. Estaba recibiendo posts crípticos como el anterior. Para darle sentido, creé classs de vista ficticias y las adjunté a las vistas en mi guión gráfico. Por ejemplo, si tuviera una UIView, creé una class llamada AddressView y la adjunté a esta vista en el tablero de historias. Es un poco lento, pero funcionó para mí. Después de eso en lugar de object-ids, obtuve nombres de class que me ayudaron a concentrarse en las vistas que causaban el problema con mucha facilidad. Mi post de error ahora se lee,

 2013-07-02 04:16:20.434 Myproject [2908:c07] Unable to simultaneously satisfy constraints. Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) ( "<NSLayoutConstraint:0x9edeae0 V:|-(0)-[AddressView:0x143ee020] (Names: '|':MainView:0x129eb6a0 )>", "<NSAutoresizingMaskLayoutConstraint:0x11e998c0 h=--& v=--& V:[MainView:0x129eb6a0(704)]>", "<NSLayoutConstraint:0x156720b0 V:[AddressView:0x143ee020]-(896)-| (Names: '|':MainView:0x129eb6a0 )>" ) 

Aquí puede ver, los nombres de mis vistas MainView y la vista Dirección están causando el problema.

Para resolverlo, acabo de mover mi subvista (en este caso, la vista de dirección) y volví a colocarla. Creo que el problema comenzó cuando utilicé una nueva combinación de Layour automático en Xcode 4.5 y habilidades antiguas o posicionamiento manual de las vistas.

De todos modos, no estoy seguro si fue más suerte que diligencia, pero, sin embargo, esta podría ser una forma diferente de debugging. Tal vez esto ayude a alguien!

gracias a http://useYourLoaf.com por esta solución completa:

http://useyourloaf.com/blog/using-identifiers-to-debug-autolayout.html

Un consejo rápido que encontré enterrado en una session de WWDC 2015 en el layout automático que ayuda a depurar problemas con restricciones

Si ha utilizado Auto Layout, estará familiarizado con el logging que Xcode escupe cuando obtiene algo incorrecto. Para crear un ejemplo, modifiqué el código de ejemplo de Stack View y agregué una restricción a cada una de las imágenes para darles un ancho fijo de 240 (no es una buena idea como veremos).

introduzca la descripción de la imagen aquí

Funciona con vistas de ancho regulares, como el iPad, pero es demasiado ancho para una vista de ancho compacto, como el iPhone en retrato. El logging de la console en time de ejecución no es divertido de leer. Omitiendo el text repetitivo obtendrá una list de las restricciones problemáticas:

 "<NSLayoutConstraint:0x7fc1ab520360 H:[UIImageView:0x7fc1ab532650(240)]>", "<NSLayoutConstraint:0x7fc1ab536ef0 H:[UIImageView:0x7fc1ab537380(240)]>", "<NSLayoutConstraint:0x7fc1ab545cc0 UIView:0x7fc1ab53d870.trailingMargin == UIStackView:0x7fc1ab53dae0.trailing>", "<NSLayoutConstraint:0x7fc1ab545d10 UIStackView:0x7fc1ab53dae0.leading == UIView:0x7fc1ab53d870.leadingMargin>", "<NSLayoutConstraint:0x7fc1ab54e240 'UISV-alignment' UIStackView:0x7fc1ab53dc70.centerX == UIStackView:0x7fc1ab531a10.centerX>", "<NSLayoutConstraint:0x7fc1ab5167c0 'UISV-canvas-connection' UIStackView:0x7fc1ab531a10.leading == UIImageView:0x7fc1ab532650.leading>", "<NSLayoutConstraint:0x7fc1ab54ad80 'UISV-canvas-connection' H:[UIImageView:0x7fc1ab537380]-(0)-| (Names: '|':UIStackView:0x7fc1ab531a10 )>", "<NSLayoutConstraint:0x7fc1ab5397d0 'UISV-canvas-connection' UIStackView:0x7fc1ab53dae0.leading == _UILayoutSpacer:0x7fc1ab54c3c0'UISV-alignment-spanner'.leading>", "<NSLayoutConstraint:0x7fc1ab54a4a0 'UISV-canvas-connection' UIStackView:0x7fc1ab53dae0.centerX == UIStackView:0x7fc1ab53dc70.centerX>", "<NSLayoutConstraint:0x7fc1ab54b110 'UISV-spacing' H:[UIImageView:0x7fc1ab532650]-(16)-[UIImageView:0x7fc1ab537380]>", "<NSLayoutConstraint:0x7fc1ab548210 'UISV-spanning-boundary' _UILayoutSpacer:0x7fc1ab54c3c0'UISV-alignment-spanner'.leading <= UIStackView:0x7fc1ab531a10.leading>", "<NSLayoutConstraint:0x7fc1ab551690 'UIView-Encapsulated-Layout-Width' H:[UIView:0x7fc1ab53d870(375)]>" 

El logging luego le dice cuál de las restricciones anteriores decidió romper:

 Will attempt to recover by breaking constraint <NSLayoutConstraint:0x7fc1ab536ef0 H:[UIImageView:0x7fc1ab537380(240)]> 

La salida de logging utiliza el lenguaje de formatting visual de layout automático, pero es difícil elegir mis restricciones de las creadas por el sistema. Este es especialmente el caso de las vistas de stack diseñadas para crear la mayoría de las restricciones para usted. En este ejemplo trivial, sé que las restricciones de ancho fijo que acabo de agregar rompieron las cosas, pero es difícil ver que desde el logging y cuanto más compleja sea la vista, más difícil será.

Agregar un identificador a una restricción

El logging es mucho más fácil de comprender si agrega un identificador a cada restricción ( NSLayoutConstraint ha tenido una propiedad de identificador desde iOS 7). En Interface Builder, encuentre la restricción y agregue el identificador en el inspector de Atributos (estoy usando $ como prefijo / sufijo para que se destaquen en el logging):

introduzca la descripción de la imagen aquí

Actualización 18 de agosto de 2015: como se señaló en los comentarios, el identificador solo se puede editar en Interface Builder comenzando con Xcode 7. No está visible en Xcode 6.4.

Si agrega la restricción en el código:

 constraint.identifier = "$HeartImageFixedWidth$" 

Es más complicado si está utilizando el lenguaje de formatting visual que usa matrices de restricciones. Por ejemplo, considere el fragment de código Swift para crear una restricción de ancho fijo para la vista de image del corazón:

 let heartWidth = NSLayoutConstraint.constraintsWithVisualFormat("[heart(240)]", options:[], metrics:nil, views:viewsDictionary) 

Como heartWidth es una matriz de tipo [NSLayoutConstraint] la configuration del identificador es un poco más de trabajo:

 for constraint in heartWidth { constraint.identifier = "$HeartImageFixedWidth$" } heartImage.addConstraints(heartWidth) 

Con el set de identificaciones para mis restricciones ahora es mucho más fácil encontrarlos en el file de logging (ver las cuatro primeras líneas):

 "<NSLayoutConstraint:0x7f92a305aeb0 '$ContainerStackViewLeading$' UIStackView:0x7f92a3053220.leading == UIView:0x7f92a3052fb0.leadingMargin + 32>", "<NSLayoutConstraint:0x7f92a305b340 '$ContainerStackViewTrailing$' UIView:0x7f92a3052fb0.trailingMargin == UIStackView:0x7f92a3053220.trailing + 32>", "<NSLayoutConstraint:0x7f92a301cf20 '$HeartImageFixedWidth$' H:[UIImageView:0x7f92a3047ef0(240)]>", "<NSLayoutConstraint:0x7f92a3009be0 '$StarImageFixedWidth$' H:[UIImageView:0x7f92a304d190(240)]>", "<NSLayoutConstraint:0x7f92a3060cc0 'UISV-alignment' UIStackView:0x7f92a30533b0.centerX == UIStackView:0x7f92a30472b0.centerX>", "<NSLayoutConstraint:0x7f92a301c590 'UISV-canvas-connection' UIStackView:0x7f92a30472b0.leading == UIImageView:0x7f92a3047ef0.leading>", "<NSLayoutConstraint:0x7f92a305f680 'UISV-canvas-connection' H:[UIImageView:0x7f92a304d190]-(0)-| (Names: '|':UIStackView:0x7f92a30472b0 )>", "<NSLayoutConstraint:0x7f92a3064190 'UISV-canvas-connection' UIStackView:0x7f92a3053220.leading == _UILayoutSpacer:0x7f92a30608a0'UISV-alignment-spanner'.leading>", "<NSLayoutConstraint:0x7f92a30415d0 'UISV-canvas-connection' UIStackView:0x7f92a3053220.centerX == UIStackView:0x7f92a30533b0.centerX>", "<NSLayoutConstraint:0x7f92a305fa10 'UISV-spacing' H:[UIImageView:0x7f92a3047ef0]-(16)-[UIImageView:0x7f92a304d190]>", "<NSLayoutConstraint:0x7f92a30508c0 'UISV-spanning-boundary' _UILayoutSpacer:0x7f92a30608a0'UISV-alignment-spanner'.leading <= UIStackView:0x7f92a30472b0.leading>", "<NSLayoutConstraint:0x7f92a3063240 'UIView-Encapsulated-Layout-Width' H:[UIView:0x7f92a3052fb0(375)]>" 

También es mucho más claro cuáles de las restricciones que el sistema ha elegido romper:

 Will attempt to recover by breaking constraint <NSLayoutConstraint:0x7f92a3009be0 '$StarImageFixedWidth$' H:[UIImageView:0x7f92a304d190(240)]> 

Agregar identificadores a las restricciones no es sin esfuerzo, pero puede compensar la próxima vez que tenga que orderar el logging de debugging de un layout complejo.

Otras lecturas

  • WWDC 2015 Session 219 Misterios de layout automático, parte 2

YourConstraintView.translatesAutoresizingMaskIntoConstraints = NO;

Lo hice por mi

He solucionado este problema al eliminar todas las properties traduceAutorización de Masas de Restricción desde el file xib (Abrir xib como un código fuente).

Una nota. Obtiene este error en los loggings si está probando con una connection de punto de connection personal, y la barra de estado de punto de acceso está en la parte superior. Arroja las restricciones.

Espero que esto ayude a alguien … me estaba volviendo loco.

Vale la pena conocer los conceptos básicos, y comprender lo que Apple / Xcode está tratando de decirle a través de los loggings.

 H = Horizontal constraint(for leading and Trailing) V = Vertical constraint(top and bottom edge) h = height w = width TopEdge -> V:|-(points)-[VIEW:memoryAddress] BottomEdge -> V:[VIEW:memoryAddress]-(points)-| Leading -> H:|-(points)-[VIEW:memoryAddress] Trailing -> H:[VIEW:memoryAddress] -(points)-| height -> h= --& v=--& V:[VIEW:memoryAddress((points)] width -> VIEW:memoryAddress.width == points between -> H:[VIEW 1]-(51)-[VIEW 2] 

Una vez que comprende esto, leer su error específico es bastante fácil