一.Masonry是什么:
答:是一個很好的三方,用來做適配的
Masonry是ios中用代碼實現(xiàn)自動布局的一個框架,使用起來特別方便,主要有mas_makeConstraints(添加約束),mas_updateConstraints(更新約束),mas_remakeConstraints(移除約束要謹慎,防止view的fram缺東西)3個方法。
二.怎么使用Masonry
1.導(dǎo)入框架:a.直接拷貝過去 b.用cocospod:pod 'Masonry', '~> 1.0.1'
2.導(dǎo)入頭文件
#define MAS_SHORTHAND
#define MAS_SHORTHAND_GLOBALS//加上這兩個宏就不需要考慮父控件了
#import "Masonry.h"
使用技巧:引入下面2個宏,就不需要加mas_前綴了。
//define this constant if you want touse Masonrywithout the'mas_' prefix
#define MAS_SHORTHAND
//define this constant if you want to enable auto-boxing for default syntax
#define MAS_SHORTHAND_GLOBALS
Shorthand(12月7日新增)
在寫代碼的時候,可能你會感覺有的東西要加mas_前綴,有的東西又不用加,代碼風(fēng)格不統(tǒng)一,而且加mas_前綴還麻煩。
前面介紹過加mas_前綴主要是在擴展系統(tǒng)類的時候為了避免與原有類沖突,這是Apple推薦的做法。不過目前來說,即使不加mas_前綴,也不會有什么問題。所以Masonry提供了不加mas_前綴的方法,只需要你定義幾個宏即可。
MAS_SHORTHAND
定義MAS_SHORTHAND宏之后。可以使用UIView,NSArray中不帶mas_前綴的makeConstraints,updateConstraints,remakeConstraints。以及UIView中不帶mas_前綴的Attribute。
MAS_SHORTHAND_GLOBALS
默認的equalTo方法只接受id類型的對象。有時候我們想傳入一個CGFloat, CGSize, UIEdgeInsets等。還需要將其轉(zhuǎn)化成NSValue對象,比較麻煩。Masonry也考慮到了這種情況。只需要定義MAS_SHORTHAND_GLOBALS宏。就可以直接對equalTo傳入基礎(chǔ)類型。Masonry自動轉(zhuǎn)化成NSValue對象
3.添加約束
?[confirmPayment mas_makeConstraints:^(MASConstraintMaker *make) {
}];
三.舉例說明
1.基本使用(一個控件的布局)
??__weak typeof (self) weakSelf = self;//防止循環(huán)使用
?[confirmPayment mas_makeConstraints:^(MASConstraintMaker *make) {
? ? make.top.equalTo(weakSelf.view).with.offset(10);//距離上面10px
? ? make.left.equalTo(weakSelf.view).with.offset(10);//距離左邊10px
? ? make.bottom.equalTo(weakSelf.view).with.offset(-10);//距離下邊10px
? ? make.right.equalTo(weakSelf.view).with.offset(-10); //距離右邊10px
? ? make.center.equalTo(weakSelf.view);//位于該父視圖的中心
? ??make.size.mas_equalTo(CGSizeMake(150, 60));//設(shè)置這個控件的大小
? ? make.edges.mas_offset(UIEdgeInsetsMake(100, 10, 100, 10));//距離上左下右各為10px
?}];
當(dāng)導(dǎo)入宏
#define MAS_SHORTHAND
#define MAS_SHORTHAND_GLOBALS//加上這兩個宏就不需要考慮父控件了
make.top.equalTo(weakSelf.view).with.offset(10);//距離上面10px
等同于
make.top.equalTo(10)//距離上面10px
2.多個控件(兄弟控件的布局)
? ? ? ?UIView *view2 = [[UILabel alloc]init];
? ? ??? view2.backgroundColor = [UIColor yellowColor];
? ? ??? [self.view addSubview:view2];
? ? ??? [view2 mas_makeConstraints:^(MASConstraintMaker *make) {
? ? ? ? ??????? make.size.mas_equalTo(CGSizeMake(100, 100));
? ? ? ? ??????? make.centerX.equalTo(view1);//view2跟view1的中心X對齊
? ? ? ? ??????? make.top.equalTo(view1.mas_bottom).with.offset(20);//view2距離view1的下面10px
? ? ? ? ??? }];
3 讓一個藍色view的內(nèi)邊距為50,點擊屏幕后內(nèi)邊距變?yōu)?00,具體實現(xiàn)如下(2中寫法):
[blueView?mas_makeConstraints:^(MASConstraintMaker?*make) {
? ? ? ? 第一種寫法
?make.left.top.equalTo(self.view).offset(20);
make.bottom.right.equalTo(self.view).offset(-20);
?第二種寫法
make.edges.insets(UIEdgeInsetsMake(50,?50,?50,?50));
? ? }];
?點擊屏幕后更新約束代碼如下:
[blueView?mas_updateConstraints:^(MASConstraintMaker?*make) {
? ? ? ? 第一種寫法
make.top.left.equalTo(self.view).offset(100);
make.bottom.right.equalTo(self.view).offset(-100);
?第二種寫法
make.edges.insets(UIEdgeInsetsMake(100,?100,?100,?100));
? ? }];
4? ?藍色view距離頂端100,距離左右各20,高度50,黑色view和藍色view右端對其,黑色view頂端距離藍色view底端20,并且寬度是藍色view的一半,截圖和代碼如下(相對于父控件的約束可以省略):

[blueView?mas_makeConstraints:^(MASConstraintMaker?*make) {
make.top.offset(100);
make.left.offset(20);
make.right.offset(-20);
make.height.offset(50);
? ? }];
[blankView?mas_makeConstraints:^(MASConstraintMaker?*make) {
make.right.equalTo(blueView);
make.height.equalTo(blueView);
make.top.equalTo(blueView.mas_bottom).offset(10);
make.width.equalTo(blueView).multipliedBy(0.5);
? ? }];