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