Skip to content

Commit

Permalink
Update constraint. If constraint that matches all properties apart fr…
Browse files Browse the repository at this point in the history
…om constant is found
  • Loading branch information
cloudkite committed Oct 24, 2013
1 parent 703ad8b commit c940a56
Showing 1 changed file with 28 additions and 3 deletions.
31 changes: 28 additions & 3 deletions Masonry/MASViewConstraint.m
Expand Up @@ -291,15 +291,40 @@ - (void)install {
@"couldn't find a common superview for %@ and %@",
firstLayoutItem, secondLayoutItem);
self.installedView = closestCommonSuperview;
[closestCommonSuperview addConstraint:layoutConstraint];
self.layoutConstraint = layoutConstraint;
} else {
self.installedView = firstLayoutItem;
[firstLayoutItem addConstraint:layoutConstraint];
}

MASLayoutConstraint *existingConstraint = [self layoutConstraintSimiliarTo:layoutConstraint];
if (existingConstraint) {
// just update the constant
existingConstraint.constant = layoutConstraint.constant;
self.layoutConstraint = existingConstraint;
} else {
[self.installedView addConstraint:layoutConstraint];
self.layoutConstraint = layoutConstraint;
}
}

- (MASLayoutConstraint *)layoutConstraintSimiliarTo:(MASLayoutConstraint *)layoutConstraint {
// check if any constraints are the same apart from the only mutable property constant

// go through constraints in reverse as we do not want to match auto-resizing or interface builder constraints
// and they are likely to be added first.
for (NSLayoutConstraint *existingConstraint in self.installedView.constraints.reverseObjectEnumerator) {
if (![existingConstraint isKindOfClass:MASLayoutConstraint.class]) continue;
if (existingConstraint.firstItem != layoutConstraint.firstItem) continue;
if (existingConstraint.secondItem != layoutConstraint.secondItem) continue;
if (existingConstraint.firstAttribute != layoutConstraint.firstAttribute) continue;
if (existingConstraint.secondAttribute != layoutConstraint.secondAttribute) continue;
if (existingConstraint.multiplier != layoutConstraint.multiplier) continue;
if (existingConstraint.priority != layoutConstraint.priority) continue;

return (id)existingConstraint;
}
return nil;
}

- (void)uninstall {
[self.installedView removeConstraint:self.layoutConstraint];
self.layoutConstraint = nil;
Expand Down

0 comments on commit c940a56

Please sign in to comment.