ios - sensibilidad - No se pueden cumplir las restricciones de forma simultánea: no hay restricciones en su lugar
problema dual (10)
Echemos un vistazo a estos uno por uno.
"<NSAutoresizingMaskLayoutConstraint:0x84543d0 h=--& v=--& V:[UIView:0xa330270(768)]>"
Esto significa que la vista 0xa330270 ( A ) debe tener 768 puntos de altura.
"<NSLayoutConstraint:0xa338350 V:[UIView:0xa331260]-(-1)-| (Names: ''|'':UIView:0xa330270 )>"
Esto significa que el borde inferior de la vista 0xa331260 ( B ) debe ser un espacio de -1 desde la parte inferior de A , que es su supervista.
"<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 supervista, A.
Estas tres cosas no pueden ser todas verdaderas: A no puede tener 768 puntos de alto, y contienen una subvista con un borde superior de 841 puntos insertados desde la parte superior y -1 puntos desde la parte inferior. ¿Dónde has definido cada una de estas restricciones?
No ha dicho qué diseño está tratando de lograr, pero parece que podría tener una máscara de aumento de tamaño en la supervista que impide que cambie de altura cuando gira el dispositivo. Por lo que sé, las restricciones de autoevaluación solo aparecen si ha agregado vistas mediante programación, ya que un guión gráfico o xib es totalmente automático o no. ¿A menos que esté haciendo algo así como agregar una vista distribuida automáticamente (cargada desde una punta?) A otra vista desde una punta no automática?
He revisado y eliminado todas las restricciones 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.
Este problema del mensaje generado "No se puede cumplir simultáneamente con las restricciones" en la consola de depuración, también se experimenta en XCode 9.4.
En mi caso particular en el simulador de iPad, el mensaje generaría:
1) Solo cuando se coloca el foco en un UITextField particular.
2) Incluso con todas las contraints de vista eliminadas.
2) Incluso con todas las contraints de la vista "Restablecer los Contraints sugeridos".
Sin embargo, cuando el teclado de software se activó para mostrarse, el mensaje no se generaría. Por lo tanto, cuánto tiempo debería dedicar a este problema, que en mi caso solo se genera cuando el teclado del software se apaga.
He solucionado este problema al eliminar todas las propiedades de traducirAutlasizingMaskIntoConstraints del archivo xib (Abrir xib como código fuente).
Para mí, este error se escupió cuando di tableView.estimatedRowHeight = UITableViewAutomaticDimension
Esto debería haber sido tableView.estimatedRowHeight = "Some hardcoded value"
Supongo que este no es un error común, pero lo resolví un tanto de forma no profesional. Estaba recibiendo mensajes crípticos como el de arriba. Para darle sentido, creé clases de vista ficticias y las adjunté a las vistas en mi guión gráfico. Por ejemplo, si tuviera un UIView, creé una clase llamada AddressView y la adjunté a esta vista en el story board. Es un poco lento, pero funcionó para mí. Después de eso, en lugar de identificadores de objeto, obtuve nombres de clase que me ayudaron a concentrarme en las vistas que causaban el problema con mucha facilidad. Mi mensaje de error ahora es leído
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 vista MainView y Address están causando el problema.
Para resolverlo, solo moví mi subvista (en este caso, vista de dirección) y la volví a ubicar. Creo que el problema comenzó cuando estaba usando una mezcla de nuevo Automatic Layour en Xcode 4.5 y viejas habilidades o posicionando manualmente 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 depuración. Tal vez esto ayude a alguien!
Tuve este problema y tardé 2 días en descubrir la fuente del problema ...
Si abre un guión gráfico programáticamente en su código, asegúrese de hacerlo así:
UIStoryboard *story = [UIStoryboard storyboardWithName:@"MovieMaker" bundle:nil];
UIViewController *vc = [story instantiateInitialViewController];
//this causes layout to break [self presentViewController:vc animated:YES completion:nil];
[self showViewController:vc sender:nil];
Estaba usando la línea comentada (usando presentViewController) y el error de orientación ha sucedido lanzando conflictos de restricciones que no eran mis limitaciones ... cambiando a showViewController todos los conflictos de restricciones se habían ido y la orientación funciona ...... (no lo hago) realmente se por que funciona con show y no presente ... sigue pensando que es ... ALIENS ...)
Una nota. Obtiene este error en los registros si está realizando pruebas utilizando una conexión de punto de acceso personal, y la barra de estado de la zona activa está en la parte superior. Lanza 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 trata de decirte a través de los registros.
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 comprenda esto, leer su error específico es bastante fácil
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 sesión de la WWDC 2015 sobre Diseño automático que ayuda a eliminar problemas con restricciones
Si ha utilizado Diseño automático, estará familiarizado con el registro que Xcode escupe cuando obtiene algo mal. Para crear un ejemplo, modifiqué mi código de muestra 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).
Eso funciona en vistas de ancho normal, como el iPad, pero es demasiado ancho para una vista de ancho compacto, como el iPhone en vertical. El registro de la consola en tiempo de ejecución no es divertido de leer. Saltarse el texto repetitivo se obtiene una lista 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 registro le dice cuál de las restricciones anteriores ha decidido romper:
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x7fc1ab536ef0 H:[UIImageView:0x7fc1ab537380(240)]>
La salida de registro utiliza el lenguaje de formato visual de diseño automático pero es difícil distinguir mis restricciones de las creadas por el sistema. Este es especialmente el caso de las vistas de pila que, por diseño, están destinadas a 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 a partir del registro y cuanto más compleja sea la vista, más difícil se vuelve.
Agregar un identificador a una restricción
El registro se vuelve mucho más fácil de entender si agrega un identificador a cada restricción ( NSLayoutConstraint
tiene 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 registro):
Actualización 18-agosto-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 formato visual que utiliza matrices de restricciones. Por ejemplo, considere el fragmento de código Swift para crear una restricción de ancho fijo para la vista de imagen de corazón:
let heartWidth = NSLayoutConstraint.constraintsWithVisualFormat("[heart(240)]",
options:[], metrics:nil, views:viewsDictionary)
Dado que heartWidth es una matriz de configuración tipo [NSLayoutConstraint], el identificador es un poco más útil:
for constraint in heartWidth {
constraint.identifier = "$HeartImageFixedWidth$"
}
heartImage.addConstraints(heartWidth)
Con los identificadores establecidos para mis restricciones, ahora es mucho más fácil encontrarlos en el archivo de registro (vea las primeras cuatro 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ál de las restricciones el sistema ha elegido para 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 ser rentable la próxima vez que tenga que ordenar el registro de depuración de un diseño complejo.
Otras lecturas
YourConstraintView.translatesAutoresizingMaskIntoConstraints = NO;
Lo hice por mí.