Incapaz de satisfacer restricciones simultáneamente, intentará recuperar rompiendo la restricción

A continuación se muestra el mensaje de error que recibo en el área de depuración. Funciona bien y nada está mal excepto que recibo este error. ¿Esto evitaría que Apple aceptara la aplicación? ¿Cómo lo arreglo?

2012-07-26 01:58:18.621 Rolo[33597:11303] 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) ( "", "", "", "", "", "", "", "", "", "", "" ) Will attempt to recover by breaking constraint  Break on objc_exception_throw to catch this in the debugger. The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in  may also be helpful. 

Yo recomendaría depurar y encontrar qué restricción es “la que no quieres” . Supongamos que tiene el siguiente problema:

enter image description here

Siempre el problema es cómo encontrar las siguientes Restricciones y Vistas.

Hay dos soluciones para hacer esto:

  1. DEBUG VIEW JERARQUÍA (No lo recomiendo de esta manera)

Como sabes dónde encontrar restricciones inesperadas (PBOUserWorkDayHeaderView), hay una manera de hacerlo bastante bien. Vamos a encontrar UIView y NSLayoutConstraint en rectangularjs rojos. Como conocemos su identificación en la memoria , es bastante fácil.

  • Detener la aplicación mediante la jerarquía de visualización de depuración :

enter image description here

  • Encuentra la UIView adecuada:

enter image description here

  • El siguiente es encontrar NSLayoutConstraint que nos importa:

enter image description here

Como puede ver, los punteros de memoria son los mismos. Entonces, sabemos lo que está sucediendo ahora. Además, puede encontrar NSLayoutConstraint en la jerarquía de vistas. Como se seleccionó en Ver, también se seleccionó en Navegador.

enter image description here

Si lo necesita, también puede imprimirlo en la consola usando el puntero de dirección:

 (lldb) po 0x17dce920 > 

Puedes hacer lo mismo para cada restricción que te señale el depurador 🙂 Ahora tú decides qué hacer con esto.

  1. IMPRIMIR MEJOR (realmente lo recomiendo, esto es de Xcode 7)

    • establecer un identificador único para cada restricción en su vista:

enter image description here

  • crear una extensión simple para NSLayoutConstraint :

SWIFT :

 extension NSLayoutConstraint { override public var description: String { let id = identifier ?? "" return "id: \(id), constant: \(constant)" //you may print whatever you want here } } 

C OBJETIVO

 @interface NSLayoutConstraint (Description) @end @implementation NSLayoutConstraint (Description) -(NSString *)description { return [NSString stringWithFormat:@"id: %@, constant: %f", self.identifier, self.constant]; } @end 
  • comstack una vez más, y ahora tienes más resultados legibles para ti:

enter image description here

  • una vez que obtuviste tu id , puedes simplemente tocarla en tu Navegador de Búsqueda :

enter image description here

  • y rápidamente lo encuentras:

enter image description here

¿CÓMO SIMPLE FIJAR ESE CASO?

  • intente cambiar la prioridad a 999 por restricción interrumpida.

El problema que tienes es que NSAutoresizingMaskLayoutConstraints no debería estar allí. Este es el viejo sistema de muelles y puntales. Para deshacerte de él, ejecuta este método en cada vista que quieras restringir:

 [view setTranslatesAutoresizingMaskIntoConstraints:NO]; 

Tenga cuidado , no use más de una restricción en la misma dirección y escriba.

Por ejemplo: restricción vertical para rastreo = 15 y otra es> = 10.

A veces, Xcode crea algunas restricciones que no notas . Debe deshacerse de las restricciones redundantes y la advertencia de registro seguramente desaparecerá.

enter image description here

Además, puedes leer y detectar algunas razones, directamente desde el registro :

NSLayoutConstraint: 0xa338390 V: | – (15) – [UILabel: 0xa331260] (Nombres: ‘|’: UILabel: 0xa330270)>

Esto lo podemos leer como un problema en la restricción de UILabel, ya que es la principal restricción vertical de 15pt de largo.

NSLayoutConstraint: 0x859ab20 H 🙁 13) – | [UIView: 0x85a8fb0] …

Esto sería una restricción horizontal posterior, etc.

Tuve este problema porque mis archivos .xib usaban el diseño automático.

En el inspector de archivos, primera pestaña. Deshabilitar “Usar Autodiseño” resolvió el problema.

inspector de archivos de autolayout

Tuve bastantes de estas excepciones, la forma más rápida y sencilla que encontré para resolverlas fue encontrar valores únicos en las excepciones que luego busqué en el código fuente del guión gráfico. Esto me ayudó a encontrar la (s) vista (s) real (es) y la (s) restricción (es) que causan el problema (uso de UserLabels significativas en todas las vistas, lo que hace que sea mucho más fácil rastrear las restricciones y vistas) …

Entonces, usando las excepciones anteriores, abriría el guión gráfico como “código fuente” en xcode (u otro editor) y buscaré algo que pueda encontrar …

  

.. esto parece una restricción vertical (V) en un UILabel con un valor de (17).

Mirando a través de las excepciones también encuentro

  

Que parece que el UILabel (0x72bf7c0) está cerca de un UIButton (0x886efe0) con un espacio vertical (8) ..

Con suerte, eso será suficiente para encontrar los puntos de vista específicos en el código fuente del guión gráfico (probablemente buscando inicialmente el texto para “17”), o al menos algunos posibles candidatos. A partir de ahí, podré descifrar cuáles son las vistas que se encuentran en el guión gráfico, lo que facilitará la identificación del problema (busque pines o pines “duplicados” que entren en conflicto con las restricciones de tamaño).

Me costó trabajo averiguar qué restricciones estaban causando este error. Aquí hay una manera más simple de hacerlo.

Estoy usando Xcode 6.1.1

  1. “Comando + A” para seleccionar todos los UILabels, UIImages, etc.
  2. Haga clic en Editor -> Pin> (Seleccionar …) en Superview
  3. nuevamente, haga clic en Editor -> Resolver problemas de diseño automático -> Agregar restricciones perdidas o Restablecer las restricciones sugeridas. Depende de tu caso

Aquí está mi experiencia y solución. No toqué el código

  1. Seleccionar vista (UILabel, UIImage, etc.)
  2. Editor> Pin> (Seleccionar …) para Superview
  3. Editor> Resolver problemas de diseño automático> Agregar restricciones faltantes

usar velozmente este código

 view.translatesAutoresizingMaskIntoConstraints = false 

He seguido las preguntas y respuestas de cada consulta de búsqueda. Pero todos están relacionados con uno específico.

En el básico, me refiero a que antes de que escriba un formato (puede ser simple) le dará advertencias.

Desde iOS 8.0 de forma predeterminada, las vistas son clases de tamaño. Incluso si deshabilita las clases de tamaño, todavía contiene algunas restricciones de diseño automático.

Entonces si está planeando establecer restricciones a través del código usando VFL. Entonces debes ocuparte de una línea debajo.

 // Remove constraints if any. [self.view removeConstraints:self.view.constraints]; 

He buscado mucho en SO, pero la solución se encuentra en Apple Sample Code .

Por lo tanto, debe eliminar las restricciones predeterminadas antes de planificar agregar una nueva.

Para mí, la razón principal de este problema fue que olvidé desmarcar AutoLayout en el editor Xib . De hecho, hice muchos ajustes del XIB en el código.

  for(UIView *view in [self.view subviews]) { [view setTranslatesAutoresizingMaskIntoConstraints:NO]; } 

Esto me ayudó a captar la vista causando el problema.

Una cosa a tener en cuenta (al menos esto me hizo tropezar) fue que estaba eliminando la restricción de la vista incorrecta. La restricción que estaba tratando de eliminar no era una restricción infantil de mi vista, así que cuando lo hice

 myView.removeConstraint(theConstraint) 

en realidad no estaba eliminando nada porque tenía que llamar

 myView.superView.removeConstraint(theConstraint) 

ya que la restricción era técnicamente la restricción de hermanos de mi punto de vista.