博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
源码阅读:Masonry(五)—— MASCompositeConstraint
阅读量:7098 次
发布时间:2019-06-28

本文共 4671 字,大约阅读时间需要 15 分钟。

该文章阅读的 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 对象    id
strongDelegate = 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.总结

可以看到,该类只是简单的保存传入的约束对象数组,在调用方法时,遍历数组调用约束对象各自的方法。

转载地址:http://oueql.baihongyu.com/

你可能感兴趣的文章
计算机存储数据方式
查看>>
Hadoop入门(7)_NameNode的工作特点
查看>>
状态模式
查看>>
[置顶] Jquery之ShowLoading遮罩组件
查看>>
ACE 格式化输出到console
查看>>
display:none与visibility:hidden的区别。
查看>>
LeetCode-287 寻找重复数
查看>>
linux中常用的查看命令
查看>>
OSI参考模型理解
查看>>
iOS 简单手势
查看>>
java web中Excel文件导入
查看>>
framwork
查看>>
MySql常用命令总结
查看>>
RSA算法原理(二)
查看>>
情景英语-美国情景会话大全 精选
查看>>
spring 事务代理的方法
查看>>
定制属于自己的linux
查看>>
我的友情链接
查看>>
nginx upstrea分配方式
查看>>
Java类加载器(死磕3)
查看>>