美文网首页
iOS - mas_makeConstraints 、 mas_

iOS - mas_makeConstraints 、 mas_

作者: ShIwEn9 | 来源:发表于2019-11-05 10:58 被阅读0次

    随着苹果移动设备的更新换代,越来越多屏幕尺度的产品开始走进生活,所以UI的适配渐渐开始占据开发中的一部分位置。
    masonry 作为自动布局中最为出色的三方之一,对其足够了解显得很有必要。

    今天就简单的来了解一下masonry 中最为重要的三个方法:mas_makeConstraints 、 mas_updateConstraints 、 mas_remakeConstraints

    我们先来看一下它们的源码是如何实现的:

    - (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *))block {
        self.translatesAutoresizingMaskIntoConstraints = NO;
        MASConstraintMaker *constraintMaker = [[MASConstraintMaker alloc] initWithView:self];
        block(constraintMaker);
        return [constraintMaker install];
    }
    
    - (NSArray *)mas_updateConstraints:(void(^)(MASConstraintMaker *))block {
        self.translatesAutoresizingMaskIntoConstraints = NO;
        MASConstraintMaker *constraintMaker = [[MASConstraintMaker alloc] initWithView:self];
        constraintMaker.updateExisting = YES;
        block(constraintMaker);
        return [constraintMaker install];
    }
    
    - (NSArray *)mas_remakeConstraints:(void(^)(MASConstraintMaker *make))block {
        self.translatesAutoresizingMaskIntoConstraints = NO;
        MASConstraintMaker *constraintMaker = [[MASConstraintMaker alloc] initWithView:self];
        constraintMaker.removeExisting = YES;
        block(constraintMaker);
        return [constraintMaker install];
    }
    

    看起来三者的实现起来都非常相似:mas_updateConstraints 中多了一个constraintMaker.updateExisting = YES;,而 mas_remakeConstraints 中多了constraintMaker.removeExisting = YES;这么一句话。
    所以三者的不同就之间转化成removeExisting 和 updateExisting ,为什么设置了这两个属性就会不同呢?
    再进到 [constraintMaker install]; 中的 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;
    }
    
    • 这里可以看到了
      当 removeExisting = yes 的时候会直接 "卸载" 掉 之前所有的约束,然后再加入新的约束。
      当 updateExisting = yes; 的时候 并不会 "卸载" 所有的约束,而是更新约束,如果之前没设置,就是加进去。

    所以这里可以给出结论了:

    • mas_makeConstraints:
    1. 一个视图,刚创建出来,没有任何约束。后期也不会重置相关的约束用这个方法。
    2. 已有的约束,再添加约束,不修改原有约束
    3. 添加新的约束, 则视图会添加这个约束
    4. 不会删除已有约束
    • mas_updateConstraints:
    1. 一个视图,刚创建出来,没有任何约束或者已经有约束需要去更新相关约束或者加入约束,但后面不回去重制约束
    2. 已有的约束,再添加约束,则更新原有约束
    3. 添加新的约束, 则视图会添加这个约束
    4. 不会删除已有约束
    • mas_remakeConstraints
    1. 一个视图虽然已经有了约束,但是之前的约束都不要了,需要重新去更新约束。
    2. 已有的约束,再添加约束,则更新原有约束
    3. 添加新的约束, 则视图会添加这个约束
    4. 会删除已有的所有约束

    参考文章:https://juejin.im/post/5c01347f6fb9a049f069fe70https://www.jianshu.com/p/91eed3edeadb

    相关文章

      网友评论

          本文标题:iOS - mas_makeConstraints 、 mas_

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