美文网首页
Masonry研究3 MASConstraintMaker

Masonry研究3 MASConstraintMaker

作者: 独孤流 | 来源:发表于2017-05-23 15:14 被阅读343次

    MASConstraintMaker


    • 涉及的类有MASConstraint,包含持有的具体数据
    • 创建maker的方法,这个方法是把View用weak持有,并创建一个保存所有设置MASConstraint的一个数组
    @interface MASConstraintMaker () <MASConstraintDelegate>
    
    @property (nonatomic, weak) MAS_VIEW *view;
    @property (nonatomic, strong) NSMutableArray *constraints;
    
    @end
    
    @implementation MASConstraintMaker
    - (id)initWithView:(MAS_VIEW *)view {
        self = [super init];
        if (!self) return nil;
        
        self.view = view;
        self.constraints = NSMutableArray.new;
        
        return self;
    }
    
    • 设置约束的第一二步就是设置top、left等属性,代码逻辑如下
    - (MASConstraint *)left {
        return [self addConstraintWithLayoutAttribute:NSLayoutAttributeLeft];
    }
    - (MASConstraint *)addConstraintWithLayoutAttribute:(NSLayoutAttribute)layoutAttribute {
        return [self constraint:nil addConstraintWithLayoutAttribute:layoutAttribute];
    }
    

    通过NSLayoutAttribute创建一个MASConstraint并将创建的约束加入到数组constraints中,如果设置的是size、center等复合型的约束,则创建包含多个子约束的MASCompositeConstraint

    - (MASConstraint *)constraint:(MASConstraint *)constraint addConstraintWithLayoutAttribute:(NSLayoutAttribute)layoutAttribute {
        MASViewAttribute *viewAttribute = [[MASViewAttribute alloc] initWithView:self.view layoutAttribute:layoutAttribute];
        MASViewConstraint *newConstraint = [[MASViewConstraint alloc] initWithFirstViewAttribute:viewAttribute];
        if ([constraint isKindOfClass:MASViewConstraint.class]) {
            //replace with composite constraint
            NSArray *children = @[constraint, newConstraint];
            MASCompositeConstraint *compositeConstraint = [[MASCompositeConstraint alloc] initWithChildren:children];
            compositeConstraint.delegate = self;
            [self constraint:constraint shouldBeReplacedWithConstraint:compositeConstraint];
            return compositeConstraint;
        }
        if (!constraint) {
            newConstraint.delegate = self;
            [self.constraints addObject:newConstraint];
        }
        return newConstraint;
    }
    

    在将设置好添加到constraints数组中的约束都设置好后就要开始把约束加到View上起作用,方法为install,逻辑如下:

    • 如果是remake,也就是removeExisting =YES时,将已经添加上的约束全部uninstall,
    • 把本次maker里的所有创建的contraint设置好updateExisting,然后一个一个的install
    - (NSArray *)install {
        if (self.removeExisting) {
            NSArray *installedConstraints = [MASViewConstraint installedConstraintsForView:self.view];
            for (MASConstraint *constraint in installedConstraints) {
                [constraint uninstall];
            }
        }
        NSArray *constraints = self.constraints.copy;
        for (MASConstraint *constraint in constraints) {
            constraint.updateExisting = self.updateExisting;
            [constraint install];
        }
        [self.constraints removeAllObjects];
        return constraints;
    }
    

    相关文章

      网友评论

          本文标题:Masonry研究3 MASConstraintMaker

          本文链接:https://www.haomeiwen.com/subject/kxtgxxtx.html