New file |
| | |
| | | // |
| | | // 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 |