¿Cómo actualizar los anclajes de layout rápido?

Tratando de encontrar una solución para actualizar múltiples restricciones para múltiples elementos de interfaz de usuario en un evento. He visto algunos ejemplos de desactivación, cambio y reactivación de restricciones, este método parece poco práctico para las 24 anclas con las que estoy trabajando.

Uno de mis sets de cambios:

ticketContainer.translatesAutoresizingMaskIntoConstraints = false ticketContainer.topAnchor.constraintEqualToAnchor(self.topAnchor).active = true ticketContainer.leftAnchor.constraintEqualToAnchor(self.rightAnchor, constant: 20).active = true ticketContainer.widthAnchor.constraintEqualToConstant(200.0).active = true ticketContainer.leftAnchor.constraintEqualToAnchor(self.leftAnchor, constant: 20).active = true ticketContainer.widthAnchor.constraintEqualToConstant(100.0).active = true 

¿Ha intentado save las restricciones relevantes que creó usando los anclajes de layout en properties y luego simplemente cambiando la constante? P.ej

 var ticketTop : NSLayoutConstraint? func setup() { ticketTop = ticketContainer.topAnchor.constraintEqualToAnchor(self.topAnchor, constant:100) ticketTop.active = true } func update() { ticketTop?.constant = 25 } 

Posiblemente más elegante

Dependiendo de su gusto por las extensiones de escritura, este es un enfoque posiblemente más elegante que no usa properties, sino que crea methods de extensión en NSLayoutAnchor y UIView para ayudar en un uso más sucinto.

Primero escribirías una extensión en NSLayoutAnchor así:

 extension NSLayoutAnchor { func constraintEqualToAnchor(anchor: NSLayoutAnchor!, constant:CGFloat, identifier:String) -> NSLayoutConstraint! { let constraint = self.constraintEqualToAnchor(anchor, constant:constant) constraint.identifier = identifier return constraint } } 

Esta extensión le permite establecer un identificador en la restricción en la misma llamada de método que lo crea desde un ancla. Tenga en count que la documentation de Apple implica que los anclajes XAxis (izquierda, derecha, guía, etc.) no le permitirán crear una restricción con anclajes YAxis (arriba, abajo, etc.), pero no observo que esto sea realmente cierto. Si quería ese tipo de comstackdor, debería escribir extensiones separadas para NSLayoutXAxisAnchor , NSLayoutYAxisAnchor y NSLayoutDimension (para restricciones de ancho y alto) que imponen el requisito de tipo de anclaje del mismo eje.

Luego escribirías una extensión en UIView para get una restricción por identificador:

 extension UIView { func constraint(withIdentifier:String) -> NSLayoutConstraint? { return self.constraints.filter{ $0.identifier == withIdentifier }.first } } 

Con estas extensiones en su lugar, su código se convierte en:

 func setup() { ticketContainer.topAnchor.constraintEqualToAnchor(self.topAnchor, constant:100, identifier:"ticketTop").active = true } func update() { self.constraint(withIdentifier:"ticketTop")?.constant = 25 } 

Tenga en count que el uso de constantes o una enumeración en lugar de nombres de cadena mágica para los identificadores sería una mejora sobre lo anterior, pero estoy manteniendo esta respuesta breve y enfocada.