iOS - mas_makeConstraints 、 mas_

2019-11-05  本文已影响0人  ShIwEn9

随着苹果移动设备的更新换代,越来越多屏幕尺度的产品开始走进生活,所以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;
}

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

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

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

上一篇下一篇

猜你喜欢

热点阅读