Search code examples
iosobjective-cswiftautolayoutnslayoutconstraint

Update height constraint programmatically


I am new in auto layout. I have done all of my project from xib file, but now I faced a problem where I have to update an view's height programmatically. I have tried below but now working.

[[self view] addConstraint:[NSLayoutConstraint constraintWithItem:loginContainer attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0f constant:loginFrame.size.height]];

In console it's shows

Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSLayoutConstraint:0x78724530 V:[UIView:0x790cdfb0(170)]>",
    "<NSLayoutConstraint:0x787da210 V:[UIView:0x790cdfb0(400)]>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x78724530 V:[UIView:0x790cdfb0(170)]>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.

Solution

  • Instead of adding a new constraint, you need to modify the constant on your existing constraint.

    Use an IBOutlet to connect to your constraint in Interface Builder:

    @property (nonatomic, weak) NSLayoutConstraint *heightConstraint;
    

    Then, when you need to set it programmatically, simply set the constant property on the constraint:

    heightConstraint.constant = 100;
    

    OR

    If you can't access the nib in Interface Builder, find the constraint in code:

    NSLayoutConstraint *heightConstraint;
    for (NSLayoutConstraint *constraint in myView.constraints) {
        if (constraint.firstAttribute == NSLayoutAttributeHeight) {
            heightConstraint = constraint;
            break;
        }
    }
    heightConstraint.constant = 100;
    

    And in Swift:

    if let constraint = (myView.constraints.filter{$0.firstAttribute == .width}.first) {
                constraint.constant = 100.0
            }