问题
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?
回答1:
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];
回答2:
Are you sure this constraint is not de-activated somewhere? Setting the "active" property of a constraint to false causes the view hierarchy to remove the constraint. If you don’t also have a reference to it, the constraint object will be deleted from memory.
I had the same issue as you, and removed the "weak" so the constraint is now a strong property. Consequently, it's not set to nil when de-activated (because my view controller always has a strong pointer to it), and I can re-activate it and re-set its constant.
// 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!
回答3:
I ran into a problem where the first time I set the constraint constant in code the constant would be set but then after calling layoutIfNeeded(), such as this:
myConstraint.constant = newValue;
[view layoutIfNeeded]
the constant would go back to the original value! I could watch the value change back in the debugger.
I finally figured out that it was because, in the storyboard, I had set a variation on the constant. For example:
As soon as I removed the variation, the constraint constant value did not change back to the original value with layoutIfNeeded call.
回答4:
when you finished your constraint changes just call:
[self setNeedsUpdateConstraints];
回答5:
The horizontalConstraint property should be holded by the view itself. As long as the view is alive the property should be not nil (unless you set it to nil explicitly somewhere else in the code). Double check whether you set it to nil by mistake.
来源:https://stackoverflow.com/questions/25241191/nslayoutconstraint-constant-not-updating-after-setting