最近花了兩週的時間讀了 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
優雅的精髓。