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

145

A continuación se muestra el mensaje de error que recibo en el área de depuración. Funciona bien y no pasa nada, excepto que recibo este error. ¿Esto evitaría que Apple acepte la aplicación? ¿Cómo lo soluciono?

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.
Johnny Cox
fuente
1
Este error solo sucederá en Xcode 4.5, por lo que no puede enviarlo a la App Store de todos modos (hasta que se
lance
Entonces, ¿no hay nada malo entonces? ¿Y sería posible usar otra versión de xcode para poder enviar a la tienda de aplicaciones?
Johnny Cox
1
Sí, hay algo mal, pero es irrelevante porque tiene que ver con una característica de iOS que aún no está disponible en las versiones públicas de Xcode. Si se compila con 4.4, puede lanzarlo usando esa versión (se lanzó hoy).
Borrrden
Recibo este mensaje de error para las aplicaciones OS X en Xcode 4.4. No lo entiendo
Steve McLeod
@ Bartłomiej Semańczyk ¿Podría por casualidad unirse a la sala: chat.stackoverflow.com/rooms/92522/autolayout-and-ios ? Lo sentimos, es aleatorio, pero agradecería su consejo sobre algo relacionado con el diseño automático, ¡gracias!
cheznead

Respuestas:

275

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

ingrese la descripción de la imagen aquí

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

Hay dos soluciones para hacer esto:

  1. DEPURAR VER JERARQUÍA (No lo recomiendo de esta manera)

Como sabe dónde encontrar restricciones inesperadas (PBOUserWorkDayHeaderView), hay una manera de hacerlo bastante bien. Vamos a buscar UIViewy NSLayoutConstrainten rectángulos rojos. Como sabemos su identificación en la memoria , es bastante fácil.

  • Detener la aplicación usando la jerarquía de vista de depuración :

ingrese la descripción de la imagen aquí

  • Encuentra la UIView adecuada:

ingrese la descripción de la imagen aquí

  • El siguiente es encontrar NSLayoutConstraint que nos interesa:

ingrese la descripción de la imagen aquí

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

ingrese la descripción de la imagen aquí

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

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

Puede hacer lo mismo para cada restricción que el depurador le señalará :-) Ahora usted decide qué hacer con esto.

  1. IMPRIMA MEJOR (Realmente recomiendo de esta manera, esto es de Xcode 7)

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

ingrese la descripción de la imagen aquí

  • 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
  • compílelo una vez más, y ahora tiene una salida más legible para usted:

ingrese la descripción de la imagen aquí

  • una vez que tenga su idpuede simplemente tocarlo en su Find Navigator :

ingrese la descripción de la imagen aquí

  • y encuéntralo rápidamente:

ingrese la descripción de la imagen aquí

¿CÓMO SIMPLE ARREGLAR ESE CASO?

  • intente cambiar la prioridad a 999por restricción rota.
Bartłomiej Semańczyk
fuente
Esto solo solucionó mi error ... muchas gracias. ¿Cómo harías esto para el objetivo c? Agregar una categoría?
cheznead
Gracias por la solución, pero ¿puedo usar la extensión en el objetivo c?
dev.nikolaz
¿Es ese identificador el mismo que accessibilityIdentifier que está disponible en UIViews mediante programación? Si no, ¿cómo se puede establecer el identificador mediante programación?
Arunabh Das
@Das no, no es lo mismo. Lea esta respuesta
Bartłomiej Semańczyk
3
Me gusta la segunda forma y creo que es la mejor manera de rastrear la restricción rota
Antarix
108

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

[view setTranslatesAutoresizingMaskIntoConstraints:NO];
David Wong
fuente
55
¿Cuáles son algunas de las razones por las cuales una vista no aparece cuando se establece setTranslatesAutoresizingMaskIntoConstraints en NO?
topwik
1
A modo de ejemplo, creo un SSBadgeView (UIView), agrego una imagen View subView al SSBadgeView, luego agrego el SSBAdgeView como una subvista a un UIReuseableView. Agrego algunas restricciones a SSBadgeView y setTranslatesAutoresizingMaskIntoConstraints: NO en SSBadgeView. la subvista de imagen de SSBadgeView se presenta como se esperaba, pero el padre SSBadgeView de la imagen no se ve por ningún lado.
topwik
1
Olvidó deshabilitar TranslatesAutoresizingMaskIntoConstraints en sus sub vistas secundarias
Softlion
Esto es lo que sucede cuando configuro esta propiedad, drive.google.com/file/d/0BxuYs8WHXCF7bV9ndHFrQ0dMYVE/… Estoy usando esta línea de código: [self.contentView setTranslatesAutoresizingMaskIntoConstraints: NO]; for (UIView * view in self.contentView.subviews) {[view setTranslatesAutoresizingMaskIntoConstraints: NO]; } Anteriormente solía verse así: drive.google.com/file/d/0BxuYs8WHXCF7OWlvZGQwN3FlbzQ/... Sin embargo, funcionó, debo decir.
rptwsthi
28

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

Por ejemplo: Restricción vertical para trailing = 15 y otra es> = 10.

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

ingrese la descripción de la imagen aquí

Además, puede leer y detectar ciertas 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 UILabel, es la restricción vertical principal de 15 puntos de longitud.

NSLayoutConstraint: 0x859ab20 H :-( 13) - | [UIView: 0x85a8fb0] ...

Esto estaría detrás de la restricción horizontal, etc.

pedrouan
fuente
6

Tuve un buen número de estas excepciones, la forma más rápida y fácil 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 las vistas y restricciones reales que causan el problema (uso userLabels significativos 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ía 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]>

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

Espero que eso sea suficiente para que encuentre las vistas específicas en el código fuente del guión gráfico (probablemente buscando inicialmente en el texto "17"), o al menos algunos candidatos probables. A partir de ahí, debería ser capaz de averiguar qué vistas están en el guión gráfico, lo que hará que sea mucho más fácil identificar el problema (busque la fijación o fijación "duplicada" que entra en conflicto con las restricciones de tamaño).

C James
fuente
"Uso userLabels significativos": ¿qué son userLabels en este contexto? (como cómo configurarlos)
Stripes
En la sección Documento del inspector de identidad hay un campo "Etiqueta" ... que se traduce a un valor "userLabel" en el código fuente del guión gráfico.
C James
También puede configurarlos haciendo clic en una vista seleccionada en el panel izquierdo "Descripción general" (un poco como cambiar el nombre de un archivo en el buscador)
C James
1
Probablemente lo mejor que he leído en lo que respecta a resolver el temido "No se puede satisfacer simultáneamente las restricciones". dolor. Descubrí que el objeto que se muestra en este punto "Intentará recuperarse rompiendo la restricción <NSLayoutConstraint:" suele ser el culpable, y como dice C James, probablemente una restricción de altura o anchura que entre en conflicto con las restricciones de fijación. Me resultó difícil eliminar la altura, pero como las restricciones eran correctas, la altura podría deducirse de las otras restricciones. Agregar una restricción de altura simplemente confundió el Diseño automático, así que eso es lo que busco ahora.
latenitecoder
6

Me costó descubrir 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 -> Anclar> (Seleccionar ...) para Supervisar
  3. nuevamente haga clic en Editor -> Resolver problemas de diseño automático -> Agregar restricciones faltantes o Restablecer restricciones sugeridas. Depende de tu caso.
Ronaldoh1
fuente
5

Tuve este problema porque mis .xibarchivos estaban usando autolayout.

En el inspector de archivos, primera pestaña. Desmarcar "Usar Autolayout" resolvió el problema.

inspector de archivos de autolayout

Stéphane Bruckert
fuente
Así que hice eso y solucioné el problema, pero un 'UIImageView' que tenía en la parte superior de la pantalla (que usé como barra de navegación) se movió a la parte inferior de la pantalla. ¿Sabes por qué sucedió eso?
dietbacon
1
Autolayout utiliza restricciones para gobernar el diseño de los objetos. Como acabas de deshabilitar la distribución automática, estas restricciones probablemente han desaparecido y, por lo tanto, la posición de tu UIImageViewha cambiado. Debe establecer esta posición nuevamente, ya sea mediante programación o mediante el Generador de interfaces.
Stéphane Bruckert
5

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

  1. Seleccionar vista (UILabel, UIImage, etc.)
  2. Editor> Anclar> (Seleccionar ...) a Supervisar
  3. Editor> Resolver problemas de diseño automático> Agregar restricciones faltantes
royemi
fuente
4

use rápido este código

view.translatesAutoresizingMaskIntoConstraints = false
Arun Kumar P
fuente
1
Esta es una respuesta rápida para una pregunta objetiva con etiqueta c.
Tobi Nary
2
@SmokeDispenser De todos modos, he mencionado que este es un código rápido. y me funcionó. rápido / objetivo es tener SDK de toque de cacao común.
Arun Kumar P
2

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

Básicamente, quiero decir, antes de escribir un formato (puede ser simple), le dará advertencias.

Desde iOS 8.0, las vistas predeterminadas son clases de tamaño. Incluso si deshabilita las clases de tamaño, seguirá conteniendo algunas restricciones de diseño automático.

Entonces, si planea establecer restricciones a través del código usando VFL. Entonces debes ocuparte de uno debajo de la línea.

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

Había buscado mucho en SO, pero la solución estaba en el código de muestra de Apple .

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

Kampai
fuente
1

Para mí, la razón principal de este problema fue que olvidé desmarcar AutoLayouten el Xibeditor. De hecho, hice muchos ajustes XIBen el código.

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

Esto me ayudó a captar la vista que causa el problema.

Grant Carlisle
fuente
1

Ninguna de las respuestas anteriores es útil en mi situación. Estoy ejecutando XCode 10.1 y probando mi aplicación en el simulador para un "iPad (5ta generación)". El simulador ejecuta iOS 12.1.

Tengo una vista raíz simple en mi guión gráfico, con dos subvistas UITextField. No se utilizan restricciones en el guión gráfico en absoluto. Y no tengo objetos UIButtonBarView en la aplicación o el guión gráfico.

No se imprimen mensajes cuando se inicia la aplicación y se despliega la vista raíz. Ninguno cuando se gira el dispositivo simulado.

Pero en el simulador, en el momento en que hago clic en uno de los campos de texto, la extensión del teclado surge desde la parte inferior de la pantalla, aunque no el teclado completo, que nunca parece aparecer en el simulador. Pero lo siguiente está impreso en la terminal:

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:0x6000034e7700 h=--& v=--& UIKeyboardAssistantBar:0x7f9c7d714af0.height == 0   (active)>",
"<NSLayoutConstraint:0x6000034aba20 V:|-(0)-[_UIUCBKBSelectionBackground:0x7f9c7d51ec70]   (active, names: '|':_UIButtonBarButton:0x7f9c7d51de40 )>",
"<NSLayoutConstraint:0x6000034aba70 _UIUCBKBSelectionBackground:0x7f9c7d51ec70.bottom == _UIButtonBarButton:0x7f9c7d51de40.bottom   (active)>",
"<NSLayoutConstraint:0x6000034fb3e0 V:|-(0)-[_UIButtonBarStackView:0x7f9c7d715880]   (active, names: '|':UIKeyboardAssistantBar:0x7f9c7d714af0 )>",
"<NSLayoutConstraint:0x6000034fb750 V:[_UIButtonBarStackView:0x7f9c7d715880]-(0)-|   (active, names: '|':UIKeyboardAssistantBar:0x7f9c7d714af0 )>",
"<NSLayoutConstraint:0x6000034abc00 'UIButtonBar.maximumAlignmentSize' _UIButtonBarButton:0x7f9c7d51de40.height == UILayoutGuide:0x600002ef4e00'UIViewLayoutMarginsGuide'.height   (active)>",
"<NSLayoutConstraint:0x6000034d7cf0 'UIView-bottomMargin-guide-constraint' V:[UILayoutGuide:0x600002ef4e00'UIViewLayoutMarginsGuide']-(9)-|   (active, names: '|':_UIButtonBarStackView:0x7f9c7d715880 )>",
"<NSLayoutConstraint:0x6000034d7c50 'UIView-topMargin-guide-constraint' V:|-(10)-[UILayoutGuide:0x600002ef4e00'UIViewLayoutMarginsGuide']   (active, names: '|':_UIButtonBarStackView:0x7f9c7d715880 )>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x6000034aba70 _UIUCBKBSelectionBackground:0x7f9c7d51ec70.bottom == _UIButtonBarButton:0x7f9c7d51de40.bottom   (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.

Ciertamente me parece que todo esto tiene que ver con nada en mi aplicación, y todo lo que tiene que ver con cómo Apple está creando su propia vista de teclado, incluso con mi pequeña extensión declarada como combinada con ella.

Entonces, la pregunta sigue siendo, ¿hay algo que yo como desarrollador de aplicaciones soy responsable de hacer (suponiendo que esto sea un montón de cosas que vale la pena atender) o es solo el problema / error de Apple?

FWIW, este mensaje de problema de restricción no se produce al simular un modelo de iPad más nuevo, como el iPad Pro de 12.9 pulgadas (tercera generación). Pero el mensaje aparece cuando se simula un iPad Pro de 9.7 pulgadas ". Todos afirman que están ejecutando iOS 12.1.

jsbox
fuente
1

Recibo el mismo error, pero solo en una vista específica, cuando toco el primer campo de texto y luego el siguiente campo de texto hacia abajo.

Estoy escribiendo en SwiftUI para iOS 13.4

 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. 
    (
        "<NSLayoutConstraint:0x2809b6760 'assistantHeight' TUISystemInputAssistantView:0x105710da0.height == 44   (active)>",
        "<NSLayoutConstraint:0x2809ccff0 'assistantView.bottom' TUISystemInputAssistantView:0x105710da0.bottom == _UIKBCompatInputView:0x10525ae10.top   (active)>",
        "<NSLayoutConstraint:0x2809cccd0 'assistantView.top' V:|-(0)-[TUISystemInputAssistantView:0x105710da0]   (active, names: '|':UIInputSetHostView:0x105215010 )>",
        "<NSLayoutConstraint:0x2809ca300 'inputView.top' V:|-(0)-[_UIKBCompatInputView:0x10525ae10]   (active, names: '|':UIInputSetHostView:0x105215010 )>"
    )

    Will attempt to recover by breaking constraint 
    <NSLayoutConstraint:0x2809ccff0 'assistantView.bottom' TUISystemInputAssistantView:0x105710da0.bottom == _UIKBCompatInputView:0x10525ae10.top   (active)>

    Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
    The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.
DckBrd
fuente
0

También recibía el mismo problema de romper restricciones en el registro, para un viewCircle en el xib. Casi probé todo lo mencionado anteriormente y nada funcionaba para mí. Luego intenté cambiar la prioridad de la restricción de Altura que se estaba rompiendo en el registro (confirmado al agregar un identificador para las restricciones en el xib). Ingrese la descripción de la imagen aquí.

Mogol
fuente
-1

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 secundaria de mi vista, así que cuando lo hice

myView.removeConstraint(theConstraint)

en realidad no estaba eliminando nada porque necesitaba llamar

myView.superView.removeConstraint(theConstraint)

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

Adam Johns
fuente
-4

rápido 4

Solo agrego esta línea en viewDidLoad y funciona bien conmigo.

view.removeConstraints(view.constraints)
Faris
fuente