最近花了两周的时间读了 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 优雅的精髓.
来源: https://juejin.im/post/5b07dcbff265da0dcd0b61f7