最近花了两周的时间读了 Masonry 源码,被它优雅的语法深深打动。它把 Apple 原生 AutoLayout 冗长,繁琐的约束语法真是封装得简洁优雅到了极致。每一次看,都能看到不一样的东西,在这里也强烈推荐各位小伙伴阅读它的源码。我把我在看源码期间想到的问题,收获,总结到了下面几个问题中,您看能答出来多少呢?欢迎在下方评论。
Masonry都做了些什么?
[self.view addSubview:btn];
[btn makeConstrants:^(MASLayoutConstraint *make){
make.left.equalTo(self.view).offset(12);
}];
上述代码会发生循环引用吗,为什么?
-
MAS_SHORTHAND、MAS_SHORTHAND_GLOBALS宏是做什么用的?它的效果是怎么实现的呢? -
Masonry的makeConstraints:、updateConstraints:、remakeConstraints:有什么区别,分别适合那些场景? -
描述下代码
make.left.right.top.equalTo(self.view).offset(0);都做了些什么? -
Masonry是如何做到链式优雅调用的?
下面几个问题可能比较细节,希望不要介意。
-
MASViewConstraint为什么要弱引用一个 MASLayoutConstraint 的实例对象,它又用这个对象做了什么? -
MASConstraintMaker持有一个constraints数组, 而MASViewConstrint类也有一个用来记录约束的数组,这两个数组都是用来记录生成的约束,那么这两个数组有什么区别吗?各自的作用又是什么?
- (NSArray *)mas_updateConstraints:(void(^)(MASConstraintMaker *))block {
self.translatesAutoresizingMaskIntoConstraints = NO;
MASConstraintMaker *constraintMaker = [[MASConstraintMaker alloc] initWithView:self];
constraintMaker.updateExisting = YES;
block(constraintMaker);
return [constraintMaker install];
}
上述源码中,MASConstraintMaker 的初始化方法 initWithView: 为MASConstraintMaker初始化了一个 view 属性 ,MASConstraintMaker 持有这个 view 做什么?
MASConstraintMaker都在什么时候会初始化MASViewAttribute对象?
尽管笔者水平有限,但对这些问题的拙劣见解还是会在下篇文章中放出,在这希望可以抛砖引玉,期待各位大牛共同探讨 Masonry 优雅的精髓。