Skip to content

Commit

Permalink
Update existing constraint rather than adding a new one. If one exist…
Browse files Browse the repository at this point in the history
…s that is the same apart from the constant property
  • Loading branch information
cloudkite committed Oct 24, 2013
1 parent 0da377d commit 13eb849
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 9 deletions.
13 changes: 7 additions & 6 deletions Masonry/MASViewAttribute.m
Expand Up @@ -21,15 +21,16 @@ - (id)initWithView:(MAS_VIEW *)view layoutAttribute:(NSLayoutAttribute)layoutAtt
}

- (BOOL)isSizeAttribute {
return self.layoutAttribute == NSLayoutAttributeWidth || self.layoutAttribute == NSLayoutAttributeHeight;
return self.layoutAttribute == NSLayoutAttributeWidth
|| self.layoutAttribute == NSLayoutAttributeHeight;
}

- (BOOL)isEqual:(id)object {
if ([object isKindOfClass:self.class]) {
MASViewAttribute *attr = object;
return ([self.view isEqual:attr.view] && self.layoutAttribute == attr.layoutAttribute);
- (BOOL)isEqual:(MASViewAttribute *)viewAttribute {
if ([viewAttribute isKindOfClass:self.class]) {
return [self.view isEqual:viewAttribute.view]
&& self.layoutAttribute == viewAttribute.layoutAttribute;
}
return [super isEqual:object];
return [super isEqual:viewAttribute];
}

- (NSUInteger)hash {
Expand Down
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 13eb849

Please sign in to comment.