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