问题
How can I modify the multiplier of a constraint programmatically? I have set the following:
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:_button attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeWidth multiplier:0.5 constant:0.0]];
and I need to modify it to this:
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:_button attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeWidth multiplier:1.0 constant:0.0]];
回答1:
As others said, you have to delete the old one and add a new one. If you do not want to store it as a property, just set identifier and search to get it later
-(NSLayoutConstraint *)constraintWithIndientifer:(NSString *)identifer InView:(UIView *)view{
NSLayoutConstraint * constraintToFind = nil;
for (NSLayoutConstraint * constraint in view.constraints ) {
if([constraint.identifier isEqualToString:identifer]){
constraintToFind = constraint;
break;
}
}
return constraintToFind;
}
Then
NSLayoutConstraint * constraint = [NSLayoutConstraint constraintWithItem:self.yellowView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeWidth multiplier:0.5 constant:0.0];
constraint.identifier = @"1234";
[self.view addConstraint:constraint];
Then you can get this
NSLayoutConstraint * constraint = [self constraintWithIndientifer:@"1234" InView:self.view];
回答2:
You won't be able to change the multiplier because it is readonly. You would have to store a reference to the constraint. Then when you want to change the multiplier you would remove the constraint and add a new one.
You could include a method like this in your view controllers implementation:
- (void)changeMultiplier:(NSLayoutConstraint **)constraint to:(CGFloat)newMultiplier{
NSLayoutConstraint *newConstraint = [NSLayoutConstraint constraintWithItem:(*constraint).firstItem attribute:(*constraint).firstAttribute relatedBy:(*constraint).relation toItem:(*constraint).secondItem attribute:(*constraint).secondAttribute multiplier:newMultiplier constant:(*constraint).constant];
[self.view removeConstraint:(*constraint)];
[self.view addConstraint:newConstraint];
*constraint = newConstraint;
}
Related Questions:
Can i change multiplier property for NSLayoutConstraint?
回答3:
For modifying multiplier I use switching between constraints method.
You must Create constraints with different priorities else it will break the layout.
Objective C
NSLayoutConstraint *constraint1, *constraint2;
// switch between constraints
constraint1.active = NO;
constraint2.active = YES;
[self.view layoutIfNeeded];
Swift 2.0
self.constraint1.active = true
self.constraint2.active = false
self.view.layoutIfNeeded()
回答4:
There's an easier way to modify the multiplier of a constraint programmatically using Layout Anchors:
imageView.heightAnchor.constraint(equalTo: imageView.widthAnchor, multiplier: 1.0/2.0).isActive = true
Here's how it works:
来源:https://stackoverflow.com/questions/30722213/auto-layout-modify-multiplier-of-constraint-programmatically