swift nslayoutconstraint

swift - Habilitar+Deshabilitar restricciones de diseño automático



nslayoutconstraint (3)

Aha!

Las restricciones se vuelven nulas (y, por lo tanto, no se pueden reactivar), una vez que su propiedad active se establece en falsa. Haciéndolos referencias fuertes (gracias, Caleb, por aclarar la nomenclatura) los conserva para que puedan ser activados y desactivados como se desee.

Tengo un problema simple (creo): tengo un UIImageView , para el cual he establecido varias restricciones en el guión gráfico.

A veces, necesitaré deshabilitar las restricciones y establecer su frame manualmente, pero más adelante, querré volver a habilitar esas restricciones y hacer que la vista regrese a donde estaba según lo decidido por las restricciones.

Pensé que podría hacer esto con algo como:

@IBOutlet weak var imageView: UIImageView! @IBOutlet weak var constraint: NSLayoutConstraint! func example() { //to set its location and size manually imageView.removeConstraint(constraint) imageView.frame = CGRectMake(...) //to cause it to return to its original position imageView.addConstraint(constraint) }

Con esto, sin embargo, me sale el error 2015-08-26 01:14:55.417 Constraints[18472:923024] The view hierarchy is not prepared for the constraint: <NSLayoutConstraint:0x7fbb72815f90 V:[_UILayoutGuide:0x7fbb72814c20]-(100)-[UIImageView:0x7fbb72814540]> . ¿Alguien sabe por qué se produce este error?

Al agregar las restricciones para self.view.addConstraint(...) llamando self.view.addConstraint(...) se elimina el error, pero aún así no vuelve la vista de la imagen a donde debería estar.

Observo que ni siquiera tengo que eliminar ni desactivar las restricciones para poder establecer el marco de la imageView sin problemas, siempre y cuando no llame a setTranslatesAutoresizingMaskIntoConstraints(true) .

Ya he visto this pregunta, pero la respuesta parece innecesariamente complicada, quizás desactualizada e incluso inaplicable.

También vi this pregunta, pero esto no cubre las restricciones que se pueden volver a habilitar, solo cómo se pueden desactivar.

Tratando de establecer la propiedad active :

self.top.active = false self.right.active = false self.bottom.active = false self.left.active = false imageView.frame = CGRectMake(100, 100, 100, 100)

En realidad, esto solo hace que imageView ser visible. (Sin embargo, si no configuro la propiedad active todas las restricciones en falso, imageView mueve a la posición correcta.

Sin embargo, el problema real es que cuando intento que la vista de la imagen regrese a donde estaba, al establecer la propiedad active todas las restricciones en true, no ocurre nada: la imageView permanece donde estaba (en este caso, como lo especifica imageView.frame = CGRectMake(100, 100, 100, 100) .

Además, según mi prueba y la respuesta de Joachim Bøggild here , parece que cuando la propiedad active una restricción se establece en falsa, esa restricción se vuelve nula y, por lo tanto, no se puede volver a activar.

Añadiendo restricciones a una matriz y activándolas / desactivándolas:

Curiosamente, esto causa casi exactamente los mismos problemas que la configuración de la propiedad active . Colocar todas las restricciones en una matriz de array , luego llamar a NSLayoutConstraint.deactivateConstraints(array) hace que la vista de la imagen desaparezca. Además, volver a activar las restricciones más adelante con NSLayoutConstraint.activateConstraints(array) no hace que la vista de la imagen regrese a donde debería, se queda donde estaba.


Conecte Restricción como IBOutlet del guión gráfico a ViewController y cree un Array add All constraint in array.

Desactive esas Restricciones cuando no estén en uso.

Añadir restricción siempre que en usos.

NSLayoutConstraint *constraint1; NSLayoutConstraint *constraint2; NSLayoutConstraint *constraint3; NSArray *arr = @[constraint1,constraint2,constraint3]; [NSLayoutConstraint deactivateConstraints:arr]; //After deactivate constraint array add what ever frame you want to add //Activate lateroN [NSLayoutConstraint activateConstraints:arr];


Si observa los documentos de NSLayoutConstraint , encontrará una sección llamada Activación y desactivación de restricciones que describe la propiedad active , que a su vez le informa:

Puede activar o desactivar una restricción cambiando esta propiedad ... Activar o desactivar las llamadas de restricción addConstraint: y removeConstraint: en la vista que es el ancestro común más cercano de los elementos administrados por esta restricción. Use esta propiedad en lugar de llamar a addConstraint: o removeConstraint: directamente.

Entonces, una vez que tenga una strong referencia a la restricción en cuestión (como la que tiene con su salida), simplemente puede establecer su propiedad active en false (o NO en Obj-C) para deshabilitarlo, o true (o YES ) para permitir.