Agregar, reutilizar y eliminar NSLayoutAnchors

Así que tengo una vista de contenedor (que está acoplada a los bordes de la pantalla) y una vista secundaria que se supone que debe deslizarse dentro y fuera de ella.

func slideOut() { UIView.animateWithDuration(Double(0.5), animations: { self.container.bottomAnchor .constraintEqualToAnchor(self.child.bottomAnchor).active = false self.view.layoutIfNeeded() }) } func slideIn() { UIView.animateWithDuration(Double(0.5), animations: { self.container.bottomAnchor .constraintEqualToAnchor(self.child.bottomAnchor).active = true self.view.layoutIfNeeded() }) print("numConstraints: \(container.constraints.count)") } 

La animation slideIn() está bien, tal como se supone que debe ser. El problema es que no sé cómo hacer la animation slideOut() . Si acabo de desactivar el NSLayoutConstraint como el anterior, entonces no pasa nada. Si en cambio bash:

 self.container.bottomAnchor .constraintEqualToAnchor(self.child.topAnchor).active = true 

entonces hay una advertencia sobre la imposibilidad de satisfacer simultáneamente las restricciones y nada sucede visualmente. Además, cada vez que NSLayoutConstraint un NSLayoutConstraint activo, NSLayoutConstraint el número de restricciones ( print(container.constraints.count) ), lo cual no puede ser bueno.

Entonces mis preguntas son:

  1. ¿Cómo hago un reverso de la animation slideIn() en este caso?
  2. ¿Cómo reutilizo las restricciones existentes en caso de animaciones repetidas para que el número de restricciones no se sume?

El método constraintEqualToAnchor crea una nueva restricción. Entonces, cuando llama a self.container.bottomAnchor.constraintEqualToAnchor(self.child.bottomAnchor) en la function de deslizar, no está utilizando la restricción que agregó en el método slideIn .

Para lograr la animation de deslizamiento deseada, debería mantener una reference a la restricción anterior. No estoy seguro de cuál sería el efecto de establecer la propiedad .active en la restricción en la function de deslizar, ya que no sé cómo se configura su jerarquía de vista. Pero una forma de reutilizar la restricción sería mantenerla como una propiedad var en su VC:

 lazy var bottomConstraint:NSLayoutConstraint = self.container.bottomAnchor .constraintEqualToAnchor(self.child.bottomAnchor) func slideOut() { UIView.animateWithDuration(Double(0.5), animations: { self.bottomConstraint.active = false self.view.layoutIfNeeded() }) } func slideIn() { UIView.animateWithDuration(Double(0.5), animations: { self.bottomConstraint.active = true self.view.layoutIfNeeded() }) print("numConstraints: \(container.constraints.count)") } 

De Apple Docs:

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 gestionados por esta restricción.

Por lo tanto, la razón por la que está viendo el mayor número de restricciones se debe a que sigue creando nuevas y agregándolas al establecerlas como verdaderas.