第三方框架-純代碼佈局:Masonry的簡單使用

Masonry是一個對系統NSLayoutConstraint進行封裝的第三方自動佈局框架,採用鏈式編程的方式提供給開發者API。系統AutoLayout支持的操做,Masonry都支持,相比系統API功能來講,Masonry是有過之而無不及。

Masonry採起了鏈式編程的方式,代碼理解起來很是清晰易懂,並且寫完以後代碼量看起來很是少。以前用NSLayoutConstraint寫不少代碼才能實現的佈局,用Masonry最少一行代碼就能夠搞定。下面看到Masonry的代碼就會發現,太簡單易懂了。編程

Masonry基礎API

mas_makeConstraints()  添加約束 框架

mas_remakeConstraints()  移除以前的約束,從新添加新的約束 less

mas_updateConstraints()  更新約束,寫哪條更新哪條,其餘約束不變 函數

equalTo()  參數是對象類型,通常是視圖對象或者mas_width這樣的座標系對象 佈局

mas_equalTo()  和上面功能相同,參數能夠傳遞基礎數據類型對象,能夠理解爲比上面的API更強大 ui

width()  用來表示寬度,例如表明view的寬度 spa

mas_width()  用來獲取寬度的值。和上面的區別在於,一個表明某個座標系對象,一個用來獲取座標系對象的值對象

view的requiresConstraintBasedLayout方法--若是你在- (void)updateConstraints這個方法裏面給自定義的控件更新控件的constraint,那麼須要重寫+ (BOOL)requiresConstraintBasedLayout方法,而且返回YES.不然的話,就不會顯示該控件。若是直接在init方法中設置自定義控件的constraint,那麼則不須要重寫+ (BOOL)requiresConstraintBasedLayout方法,也能夠顯示。

更新約束和佈局

- (void)setNeedsUpdateConstraints  標記須要進行從新佈局
- (void)updateConstraintsIfNeeded  調用此方法,若是有標記爲須要從新佈局的約束,則當即進行從新佈局,內部會調用updateConstraints方法
- (void)updateConstraints  重寫此方法,內部實現自定義佈局過程
- (BOOL)needsUpdateConstraints  當前是否須要從新佈局,內部會判斷當前有沒有被標記的約束
關於UIView從新佈局相關的API,主要用如下三個API:
- (void)setNeedsLayout  標記爲須要從新佈局
- (void)layoutIfNeeded  查看當前視圖是否被標記須要從新佈局,有則在內部調用layoutSubviews方法進行從新佈局 
- (void)layoutSubviews  重寫當前方法,在內部完成從新佈局操做

Masonry經常使用方法

設置內邊距

[self.yellowView mas_makeConstraints:^(MASConstraintMaker *make) { ip

make.left.equalTo(self.view).with.offset(10); 開發

make.top.equalTo(self.view).with.offset(10); 

make.right.equalTo(self.view).with.offset(-10); 

make.bottom.equalTo(self.view).with.offset(-10); 

}];

 

[self.blueView mas_makeConstraints:^(MASConstraintMaker *make) { 

make.edges.equalTo(self.view).with.insets(UIEdgeInsetsMake(10, 10, 10, 10)); 

}];

更新約束

[self.greenView mas_updateConstraints:^(MASConstraintMaker *make) { make.size.mas_equalTo(CGSizeMake(100, 100)); }];

 

大於等於和小於等於某個值的約束

[self.textLabel mas_makeConstraints:^(MASConstraintMaker *make) { 

make.center.equalTo(self.view); // 設置寬度小於等於200 

make.width.lessThanOrEqualTo(@200); // 設置高度大於等於10 

make.height.greaterThanOrEqualTo(@(10)); }];

使用基礎數據類型當作參數

/** 若是想使用基礎數據類型當作參數,Masonry爲咱們提供了"mas_xx"格式的宏定義。 這些宏定義會將傳入的基礎數據類型轉換爲NSNumber類型,這個過程叫作封箱(Auto Boxing)。 "mas_xx"開頭的宏定義,內部都是經過MASBoxValue()函數實現的。 這樣的宏定義主要有四個,分別是mas_equalTo()、mas_offset()和大於等於、小於等於四個。 */ 

[self.redView mas_makeConstraints:^(MASConstraintMaker *make) { 

make.center.equalTo(self.view); 

make.width.mas_equalTo(100); 

make.height.mas_equalTo(100); }];

設置約束優先級

/** Masonry爲咱們提供了三個默認的方法,priorityLow()、priorityMedium()、priorityHigh(),這三個方法內部對應着不一樣的默認優先級。 除了這三個方法,咱們也能夠本身設置優先級的值,能夠經過priority()方法來設置。 */ 

[self.redView mas_makeConstraints:^(MASConstraintMaker *make) { 

make.center.equalTo(self.view); 

make.width.equalTo(self.view).priorityLow(); 

make.width.mas_equalTo(20).priorityHigh(); 

make.height.equalTo(self.view).priority(200); 

make.height.mas_equalTo(100).priority(1000); }];

設置約束比例

// 設置當前約束值乘以多少,例如這個例子是redView的寬度是self.view寬度的0.2倍。 

[self.redView mas_makeConstraints:^(MASConstraintMaker *make) { 

make.center.equalTo(self.view); 

make.height.mas_equalTo(30); 

make.width.equalTo(self.view).multipliedBy(0.2); }]

參考文章:

iOS自動佈局框架-Masonry詳解

相關文章
相關標籤/搜索