Remove all constraints affecting a UIView Remove all constraints affecting a UIView ios ios

Remove all constraints affecting a UIView


This approach worked for me:

@interface UIView (RemoveConstraints)- (void)removeAllConstraints;@end@implementation UIView (RemoveConstraints)- (void)removeAllConstraints{    UIView *superview = self.superview;    while (superview != nil) {        for (NSLayoutConstraint *c in superview.constraints) {            if (c.firstItem == self || c.secondItem == self) {                [superview removeConstraint:c];            }        }        superview = superview.superview;    }    [self removeConstraints:self.constraints];    self.translatesAutoresizingMaskIntoConstraints = YES;}@end

After it's done executing your view remains where it was because it creates autoresizing constraints. When I don't do this the view usually disappears. Additionally, it doesn't just remove constraints from superview but traversing all the way up as there may be constraints affecting it in ancestor views.


Swift 4 Version

extension UIView {        public func removeAllConstraints() {        var _superview = self.superview                while let superview = _superview {            for constraint in superview.constraints {                                if let first = constraint.firstItem as? UIView, first == self {                    superview.removeConstraint(constraint)                }                                if let second = constraint.secondItem as? UIView, second == self {                    superview.removeConstraint(constraint)                }            }                        _superview = superview.superview        }                self.removeConstraints(self.constraints)        self.translatesAutoresizingMaskIntoConstraints = true    }}


The only solution I have found so far is to remove the view from its superview:

[view removeFromSuperview]

This looks like it removes all constraints affecting its layout and is ready to be added to a superview and have new constraints attached. However, it will incorrectly remove any subviews from the hierarchy as well, and get rid of [C7] incorrectly.


You can remove all constraints in a view by doing this:

self.removeConstraints(self.constraints)

EDIT: To remove the constraints of all subviews, use the following extension in Swift:

extension UIView {    func clearConstraints() {        for subview in self.subviews {            subview.clearConstraints()        }        self.removeConstraints(self.constraints)    }}