NSLayoutConstraint constant not updating after setting

Ramin Afshar picture Ramin Afshar · Aug 11, 2014 · Viewed 37.2k times · Source

I have a UIView subclass with a corresponding xib file. In my xib I have a NSLayoutConstraint property which I'm trying to animate. I have an animateIn method. The problem is that only the animateIn method works. When I try to update the constant again it simply stays at the previous value.

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

I'm trying to update the constant after a button press. But the constant doesn't seem to update after setting. It still logs 0 even after setting it to -500. I'm calling layoutIfNeeded but nothing happens.

// 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
    }

UPDATE

It seems that my NSLayoutConstraint is (null) when I want to use it a second time. That would explain why it is not updating. How should I keep a reference to it?

Answer

Yogesh Suthar picture Yogesh Suthar · Aug 11, 2014

You will need to call setNeedsUpdateConstraints method of corresponding UIView(control) of which your NSLayoutConstraint is present to update constraint.

For example of UIButton

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

In your case

[self setNeedsUpdateConstraints];