auto layout modify multiplier of constraint programmatically

前端 未结 4 2055
爱一瞬间的悲伤
爱一瞬间的悲伤 2021-01-06 13:37

How can I modify the multiplier of a constraint programmatically? I have set the following:

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:_         


        
相关标签:
4条回答
  • 2021-01-06 14:08

    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?

    0 讨论(0)
  • 2021-01-06 14:15

    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()
    
    0 讨论(0)
  • 2021-01-06 14:19

    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:

    0 讨论(0)
  • 2021-01-06 14:23

    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];
    
    0 讨论(0)
提交回复
热议问题