ios objective-c debugging nslayoutconstraint

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



objective-c debugging (12)

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) ( "<NSAutoresizingMaskLayoutConstraint:0x887d630 h=--& v=--& V:[UIButtonLabel:0x886ed80(19)]>", "<NSAutoresizingMaskLayoutConstraint:0x887d5f0 h=--& v=--& UIButtonLabel:0x886ed80.midY == + 37.5>", "<NSAutoresizingMaskLayoutConstraint:0x887b4b0 h=--& v=--& V:[UIButtonLabel:0x72bb9b0(19)]>", "<NSAutoresizingMaskLayoutConstraint:0x887b470 h=--& v=--& UIButtonLabel:0x72bb9b0.midY == - 0.5>", "<NSLayoutConstraint:0x72bf860 V:[UILabel:0x72bf7c0(17)]>", "<NSLayoutConstraint:0x72c2430 UILabel:0x72bfad0.top == UILabel:0x72bf7c0.top>", "<NSLayoutConstraint:0x72c2370 UILabel:0x72c0270.top == UILabel:0x72bfad0.top>", "<NSLayoutConstraint:0x72c22b0 V:[UILabel:0x72bf7c0]-(NSSpace(8))-[UIButton:0x886efe0]>", "<NSLayoutConstraint:0x72c15b0 V:[UILabel:0x72c0270]-(NSSpace(8))-[UIRoundedRectButton:0x72bbc10]>", "<NSLayoutConstraint:0x72c1570 UIRoundedRectButton:0x72bbc10.baseline == UIRoundedRectButton:0x7571170.baseline>", "<NSLayoutConstraint:0x72c21f0 UIRoundedRectButton:0x7571170.top == UIButton:0x886efe0.top>" ) Will attempt to recover by breaking constraint <NSLayoutConstraint:0x72bf860 V:[UILabel:0x72bf7c0(17)]> 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.


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

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];


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.


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

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.


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 ...

<NSLayoutConstraint:0x72bf860 V:[UILabel:0x72bf7c0(17)]>

.. 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

<NSLayoutConstraint:0x72c22b0 V:[UILabel:0x72bf7c0]-(NSSpace(8))-[UIButton:0x886efe0]>

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).


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.


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.


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

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 rectángulos 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 :
  • Encuentra la UIView adecuada:
  • El siguiente es encontrar NSLayoutConstraint que nos importa:

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.

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

(lldb) po 0x17dce920 <UIView: 0x17dce920; frame = (10 30; 300 24.5); autoresize = RM+BM; layer = <CALayer: 0x17dce9b0>>

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:

  • 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

  • compila una vez más, y ahora tienes más resultados legibles para ti:

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

  • y rápidamente lo encuentras:

¿CÓMO SIMPLE FIJAR ESE CASO?

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

usar velozmente este código

view.translatesAutoresizingMaskIntoConstraints = false


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á.

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.


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

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