You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
183 lines
4.8 KiB
183 lines
4.8 KiB
// |
|
// MASCompositeConstraint.m |
|
// Masonry |
|
// |
|
// Created by Jonas Budelmann on 21/07/13. |
|
// Copyright (c) 2013 cloudling. All rights reserved. |
|
// |
|
|
|
#import "MASCompositeConstraint.h" |
|
#import "MASConstraint+Private.h" |
|
|
|
@interface MASCompositeConstraint () <MASConstraintDelegate> |
|
|
|
@property (nonatomic, strong) id mas_key; |
|
@property (nonatomic, strong) NSMutableArray *childConstraints; |
|
|
|
@end |
|
|
|
@implementation MASCompositeConstraint |
|
|
|
- (id)initWithChildren:(NSArray *)children { |
|
self = [super init]; |
|
if (!self) return nil; |
|
|
|
_childConstraints = [children mutableCopy]; |
|
for (MASConstraint *constraint in _childConstraints) { |
|
constraint.delegate = self; |
|
} |
|
|
|
return self; |
|
} |
|
|
|
#pragma mark - MASConstraintDelegate |
|
|
|
- (void)constraint:(MASConstraint *)constraint shouldBeReplacedWithConstraint:(MASConstraint *)replacementConstraint { |
|
NSUInteger index = [self.childConstraints indexOfObject:constraint]; |
|
NSAssert(index != NSNotFound, @"Could not find constraint %@", constraint); |
|
[self.childConstraints replaceObjectAtIndex:index withObject:replacementConstraint]; |
|
} |
|
|
|
- (MASConstraint *)constraint:(MASConstraint __unused *)constraint addConstraintWithLayoutAttribute:(NSLayoutAttribute)layoutAttribute { |
|
id<MASConstraintDelegate> strongDelegate = self.delegate; |
|
MASConstraint *newConstraint = [strongDelegate constraint:self addConstraintWithLayoutAttribute:layoutAttribute]; |
|
newConstraint.delegate = self; |
|
[self.childConstraints addObject:newConstraint]; |
|
return newConstraint; |
|
} |
|
|
|
#pragma mark - NSLayoutConstraint multiplier proxies |
|
|
|
- (MASConstraint * (^)(CGFloat))multipliedBy { |
|
return ^id(CGFloat multiplier) { |
|
for (MASConstraint *constraint in self.childConstraints) { |
|
constraint.multipliedBy(multiplier); |
|
} |
|
return self; |
|
}; |
|
} |
|
|
|
- (MASConstraint * (^)(CGFloat))dividedBy { |
|
return ^id(CGFloat divider) { |
|
for (MASConstraint *constraint in self.childConstraints) { |
|
constraint.dividedBy(divider); |
|
} |
|
return self; |
|
}; |
|
} |
|
|
|
#pragma mark - MASLayoutPriority proxy |
|
|
|
- (MASConstraint * (^)(MASLayoutPriority))priority { |
|
return ^id(MASLayoutPriority priority) { |
|
for (MASConstraint *constraint in self.childConstraints) { |
|
constraint.priority(priority); |
|
} |
|
return self; |
|
}; |
|
} |
|
|
|
#pragma mark - NSLayoutRelation proxy |
|
|
|
- (MASConstraint * (^)(id, NSLayoutRelation))equalToWithRelation { |
|
return ^id(id attr, NSLayoutRelation relation) { |
|
for (MASConstraint *constraint in self.childConstraints.copy) { |
|
constraint.equalToWithRelation(attr, relation); |
|
} |
|
return self; |
|
}; |
|
} |
|
|
|
#pragma mark - attribute chaining |
|
|
|
- (MASConstraint *)addConstraintWithLayoutAttribute:(NSLayoutAttribute)layoutAttribute { |
|
[self constraint:self addConstraintWithLayoutAttribute:layoutAttribute]; |
|
return self; |
|
} |
|
|
|
#pragma mark - Animator proxy |
|
|
|
#if TARGET_OS_MAC && !(TARGET_OS_IPHONE || TARGET_OS_TV) |
|
|
|
- (MASConstraint *)animator { |
|
for (MASConstraint *constraint in self.childConstraints) { |
|
[constraint animator]; |
|
} |
|
return self; |
|
} |
|
|
|
#endif |
|
|
|
#pragma mark - debug helpers |
|
|
|
- (MASConstraint * (^)(id))key { |
|
return ^id(id key) { |
|
self.mas_key = key; |
|
int i = 0; |
|
for (MASConstraint *constraint in self.childConstraints) { |
|
constraint.key([NSString stringWithFormat:@"%@[%d]", key, i++]); |
|
} |
|
return self; |
|
}; |
|
} |
|
|
|
#pragma mark - NSLayoutConstraint constant setters |
|
|
|
- (void)setInsets:(MASEdgeInsets)insets { |
|
for (MASConstraint *constraint in self.childConstraints) { |
|
constraint.insets = insets; |
|
} |
|
} |
|
|
|
- (void)setInset:(CGFloat)inset { |
|
for (MASConstraint *constraint in self.childConstraints) { |
|
constraint.inset = inset; |
|
} |
|
} |
|
|
|
- (void)setOffset:(CGFloat)offset { |
|
for (MASConstraint *constraint in self.childConstraints) { |
|
constraint.offset = offset; |
|
} |
|
} |
|
|
|
- (void)setSizeOffset:(CGSize)sizeOffset { |
|
for (MASConstraint *constraint in self.childConstraints) { |
|
constraint.sizeOffset = sizeOffset; |
|
} |
|
} |
|
|
|
- (void)setCenterOffset:(CGPoint)centerOffset { |
|
for (MASConstraint *constraint in self.childConstraints) { |
|
constraint.centerOffset = centerOffset; |
|
} |
|
} |
|
|
|
#pragma mark - MASConstraint |
|
|
|
- (void)activate { |
|
for (MASConstraint *constraint in self.childConstraints) { |
|
[constraint activate]; |
|
} |
|
} |
|
|
|
- (void)deactivate { |
|
for (MASConstraint *constraint in self.childConstraints) { |
|
[constraint deactivate]; |
|
} |
|
} |
|
|
|
- (void)install { |
|
for (MASConstraint *constraint in self.childConstraints) { |
|
constraint.updateExisting = self.updateExisting; |
|
[constraint install]; |
|
} |
|
} |
|
|
|
- (void)uninstall { |
|
for (MASConstraint *constraint in self.childConstraints) { |
|
[constraint uninstall]; |
|
} |
|
} |
|
|
|
@end
|
|
|