该文章阅读的 Masonry 的版本为 1.1.0。
该类是 MASConstraint 类的一个子类,它封装着一组约束对象。这个对象应用于以下场景:
make.top.left.bottom.right.equalTo(self.view);复制代码
1.公共方法
- (id)initWithChildren:(NSArray *)children;复制代码
这个类的 .h
文件中,只有这一个方法,这个方法用于以指定的一组约束对象初始化该类对象。
2.类扩展
@property (nonatomic, strong) id mas_key;复制代码
这个属性保存用于标识约束的 key。
@property (nonatomic, strong) NSMutableArray *childConstraints;复制代码
这个属性保存着初始化时传入的约束对象数组。
3.实现
3.1 公共方法
- (id)initWithChildren:(NSArray *)children { self = [super init]; if (!self) return nil; _childConstraints = [children mutableCopy]; for (MASConstraint *constraint in _childConstraints) { constraint.delegate = self; } return self;}复制代码
初始化方法中,除了保存传入的约束对象数组,还遍历数组设置了每个约束对象的代理。
3.2 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 { // 获取当前对象的代理,也就是 MASConstraintMaker 对象 idstrongDelegate = self.delegate; // 调用 MASConstraintMaker 对象对该代理方法的实现获取到新约束对象 MASConstraint *newConstraint = [strongDelegate constraint:self addConstraintWithLayoutAttribute:layoutAttribute]; // 设置新约束对象的代理对象 newConstraint.delegate = self; // 保存约束对象 [self.childConstraints addObject:newConstraint]; return newConstraint;}复制代码
3.3 父类方法
- (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; };}- (MASConstraint * (^)(MASLayoutPriority))priority { return ^id(MASLayoutPriority priority) { for (MASConstraint *constraint in self.childConstraints) { constraint.priority(priority); } return self; };}- (MASConstraint * (^)(id, NSLayoutRelation))equalToWithRelation { return ^id(id attr, NSLayoutRelation relation) { for (MASConstraint *constraint in self.childConstraints.copy) { constraint.equalToWithRelation(attr, relation); } return self; };}- (MASConstraint *)animator { for (MASConstraint *constraint in self.childConstraints) { [constraint animator]; } return self;}- (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; };}- (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; }}- (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]; }}复制代码
可以看到这些方法的实现都是遍历出数组中的每一个约束对象,然后调用每个约束对象对应的方法,这类的约束对象其实就是 MASViewConstraint 类对象。
- (MASConstraint *)addConstraintWithLayoutAttribute:(NSLayoutAttribute)layoutAttribute { [self constraint:self addConstraintWithLayoutAttribute:layoutAttribute]; return self;}复制代码
这个方法直接调用了该类对代理方法的实现。
4.总结
可以看到,该类只是简单的保存传入的约束对象数组,在调用方法时,遍历数组调用约束对象各自的方法。