auto layout modify multiplier of constriaint programmatically

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:

  • What is the difference between all these Auto Layout update methods? Are all necessary?
  • UITableView within UIScrollView using autolayout
  • Nested UICollectionViews, AutoLayout and rotation in iOS 8
  • How the apps already build for iPhone 4 and 5 will shown in iPhone 6 and 6 plus
  • Using NSLayoutConstraint on a subview in conjuction with an affine transform
  • How is it possible that UITableViewCellContentView height is different from heightForRowAtIndexPath:
  • [self.view addConstraint:[NSLayoutConstraint constraintWithItem:_button attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeWidth multiplier:1.0 constant:0.0]];
    

    3 Solutions Collect From Internet About “auto layout modify multiplier of constriaint programmatically”

    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];
    

    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?

    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()