第三方框架-純代碼布局:Masonry的簡單使用
Masonry采取了鏈式編程的方式,代碼理解起來非常清晰易懂,而且寫完之後代碼量看起來非常少。之前用NSLayoutConstraint寫很多代碼才能實現的布局,用Masonry最少一行代碼就可以搞定。下面看到Masonry的代碼就會發現,太簡單易懂了。
Masonry基礎API
mas_makeConstraints() 添加約束
mas_remakeConstraints() 移除之前的約束,重新添加新的約束
mas_updateConstraints() 更新約束,寫哪條更新哪條,其他約束不變
equalTo() 參數是對象類型,一般是視圖對象或者mas_width這樣的坐標系對象
mas_equalTo() 和上面功能相同,參數可以傳遞基礎數據類型對象,可以理解為比上面的API更強大
width() 用來表示寬度,例如代表view的寬度
mas_width() 用來獲取寬度的值。和上面的區別在於,一個代表某個坐標系對象,一個用來獲取坐標系對象的值
view的requiresConstraintBasedLayout方法--如果你在- (void)updateConstraints這個方法裏面給自定義的控件更新控件的constraint,那麽需要重寫+ (BOOL)requiresConstraintBasedLayout方法,並且返回YES.否則的話,就不會顯示該控件。如果直接在init方法中設置自定義控件的constraint,那麽則不需要重寫+ (BOOL)requiresConstraintBasedLayout方法,也可以顯示。更新約束和布局
- (void)updateConstraintsIfNeeded 調用此方法,如果有標記為需要重新布局的約束,則立即進行重新布局,內部會調用updateConstraints方法
- (void)updateConstraints 重寫此方法,內部實現自定義布局過程
- (BOOL)needsUpdateConstraints 當前是否需要重新布局,內部會判斷當前有沒有被標記的約束
關於UIView重新布局相關的API,主要用以下三個API:
- (void)setNeedsLayout 標記為需要重新布局
Masonry常用方法
設置內邊距
[self.yellowView mas_makeConstraints:^(MASConstraintMaker *make) {
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詳解
第三方框架-純代碼布局:Masonry的簡單使用