NSLayoutConstraint constante no se actualiza después de la configuration

Tengo una subclass UIView con un file xib correspondiente. En mi xib tengo una propiedad NSLayoutConstraint que estoy tratando de animar. Tengo un método animateIn . El problema es que solo el método animateIn funciona. Cuando trato de actualizar la constante de nuevo, simplemente se queda en el valor anterior.

 @property (weak, nonatomic) IBOutlet NSLayoutConstraint *horizontalConstraint; 

Estoy intentando actualizar la constante después de presionar un button. Pero la constante no parece actualizarse después de la configuration. Todavía registra 0 incluso después de configurarlo a -500. Estoy llamando a layoutIfNeeded pero no ocurre nada.

 // this works - (void) animateIn { [UIView animateWithDuration:1.0 delay:2.0 options:UIViewAnimationOptionCurveEaseInOut animations:^{ self.alpha = 1.0; } completion:^(BOOL finished) { [UIView animateWithDuration:1.0 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{ self.horizontalConstraint.constant = 0; [self layoutIfNeeded]; } completion:^(BOOL finished) { }]; }]; } // this does not work - (IBAction)resume:(id)sender { self.horizontalConstraint.constant = -500; [self layoutIfNeeded]; NSLog(@"%f",self.horizontalConstraint.constant); // this always stays 0 } 

ACTUALIZAR

Parece que mi NSLayoutConstraint es (nulo) cuando quiero utilizarlo por segunda vez. Eso explicaría por qué no se está actualizando. ¿Cómo debo mantener una reference a esto?

Deberá llamar setNeedsUpdateConstraints método setNeedsUpdateConstraints de la UIView(control) de la que está presente su NSLayoutConstraint para actualizar la restricción.

Por ejemplo de UIButton

 self.buttonConstraint.constant = 55; [self.btnTest setNeedsUpdateConstraints]; 

En tu caso

 [self setNeedsUpdateConstraints]; 

Cuando termine los cambios de restricción, simplemente llame:

 [self setNeedsUpdateConstraints]; 

¿Estás seguro de que esta restricción no se desactiva en alguna parte? Establecer la propiedad "activa" de una restricción en falso hace que la jerarquía de vista elimine la restricción. Si no tiene una reference al mismo, el object de restricción se eliminará de la memory.

Tuve el mismo problema que tú y eliminé el "débil" por lo que la restricción ahora es una propiedad sólida. En consecuencia, no se establece en cero cuando se desactiva (porque mi controller de vista siempre tiene un puntero fuerte), y puedo volver a activarlo y volver a establecer su constante.

 // NB: don't create these contraints outlets as "weak" if you intend to de-activate them, otherwise they would be set to nil when deactivated! @IBOutlet private var captionViewHeightConstraint: NSLayoutConstraint! 

La propiedad horizontalConstraint debe ser retenida por la vista misma. Siempre que la vista esté viva, la propiedad no debe ser nula (a less que la configures a nil explícitamente en otro lugar del código). Compruebe dos veces si lo configura a cero por error.