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;
}
- 这里可以看到了
当 removeExisting = yes 的时候会直接 "卸载" 掉 之前所有的约束,然后再加入新的约束。
当 updateExisting = yes; 的时候 并不会 "卸载" 所有的约束,而是更新约束,如果之前没设置,就是加进去。
所以这里可以给出结论了:
mas_makeConstraints:
- 一个视图,刚创建出来,没有任何约束。后期也不会重置相关的约束用这个方法。
- 已有的约束,再添加约束,不修改原有约束
- 添加新的约束, 则视图会添加这个约束
- 不会删除已有约束
mas_updateConstraints:
- 一个视图,刚创建出来,没有任何约束或者已经有约束需要去更新相关约束或者加入约束,但后面不回去重制约束
- 已有的约束,再添加约束,则更新原有约束
- 添加新的约束, 则视图会添加这个约束
- 不会删除已有约束
mas_remakeConstraints
- 一个视图虽然已经有了约束,但是之前的约束都不要了,需要重新去更新约束。
- 已有的约束,再添加约束,则更新原有约束
- 添加新的约束, 则视图会添加这个约束
- 会删除已有的所有约束
参考文章:https://juejin.im/post/5c01347f6fb9a049f069fe70、https://www.jianshu.com/p/91eed3edeadb