iOS-Masonry的簡(jiǎn)單使用

1.Masonry的基本API

mas_makeConstraints()   // 添加約束
mas_remakeConstraints()  //移除之前的約束睦优,重新添加新的約束
mas_updateConstraints()  //更新約束

equalTo()      // 參數(shù)是對(duì)象類(lèi)型耐薯,一般是視圖對(duì)象或者mas_width這樣的坐標(biāo)系對(duì)象
mas_equalTo()   //和上面功能相同键痛,參數(shù)可以傳遞基礎(chǔ)數(shù)據(jù)類(lèi)型對(duì)象育八,可以理解為比上面的API更強(qiáng)大
width()         //用來(lái)表示寬度,例如代表view的寬度
mas_width()     //用來(lái)獲取寬度的值改执。和上面的區(qū)別在于啸蜜,一個(gè)代表某個(gè)坐標(biāo)系對(duì)象,一個(gè)用來(lái)獲取坐標(biāo)系對(duì)象的值

上面例如equalTo或者width這樣的辈挂,有時(shí)候需要涉及到使用mas_前綴衬横,注意區(qū)分。

//控件左邊 = 參考控件的右邊 + 偏移值(10) (控件在參考控件的右邊终蒂,距離其5px)
make.left.equalTo(view.superview.mas_right).offset(10);//不填則默認(rèn)對(duì)應(yīng)left蜂林,其他同理

注意:masequalTo 和 equalTo 區(qū)別:masequalTo 比equalTo多了類(lèi)型轉(zhuǎn)換操作,一般來(lái)說(shuō)拇泣,大多數(shù)時(shí)候兩個(gè)方法都是通用的噪叙,但是對(duì)于數(shù)值元素使用mas_equalTo。對(duì)于對(duì)象或是多個(gè)屬性的處理霉翔,使用equalTo睁蕾。特別是多個(gè)屬性時(shí),必須使用equalTo,例如make.left.and.right.equalTo(self.view);

注意:在循環(huán)cell债朵,如果有代碼重復(fù)調(diào)用的地方子眶,一定要使用mas_remakeConstraints,以此防止循環(huán)的時(shí)候生成相同的約束葱弟,影響性能,甚至猜丹,能使用make的地方基本都可以用remake進(jìn)行代替芝加,防止生成無(wú)謂的約束

2.關(guān)于更新約束布局相關(guān)的API

- (void)updateConstraintsIfNeeded  //調(diào)用此方法,如果有標(biāo)記為需要重新布局的約束射窒,則立即進(jìn)行重新布局藏杖,內(nèi)部會(huì)調(diào)用updateConstraints方法
- (void)updateConstraints          //重寫(xiě)此方法,內(nèi)部實(shí)現(xiàn)自定義布局過(guò)程
- (BOOL)needsUpdateConstraints     //當(dāng)前是否需要重新布局脉顿,內(nèi)部會(huì)判斷當(dāng)前有沒(méi)有被標(biāo)記的約束
- (void)setNeedsUpdateConstraints  //標(biāo)記需要進(jìn)行重新布局

3.Masonry的屬性

@property (nonatomic, strong, readonly) MASConstraint *left;
@property (nonatomic, strong, readonly) MASConstraint *top;
@property (nonatomic, strong, readonly) MASConstraint *right;
@property (nonatomic, strong, readonly) MASConstraint *bottom;
@property (nonatomic, strong, readonly) MASConstraint *leading; 
@property (nonatomic, strong, readonly) MASConstraint *trailing;
@property (nonatomic, strong, readonly) MASConstraint *width;
@property (nonatomic, strong, readonly) MASConstraint *height;
@property (nonatomic, strong, readonly) MASConstraint *centerX;
@property (nonatomic, strong, readonly) MASConstraint *centerY;
@property (nonatomic, strong, readonly) MASConstraint *baseline;

注意:其中l(wèi)eading與left trailing與right 在正常情況下是等價(jià)的 但是當(dāng)一些布局是從右至左時(shí)蝌麸,則會(huì)對(duì)調(diào) 換句話(huà)說(shuō)就是基本不用, 用left和right就好了艾疟。用leading/trailing 后就不要用left/right来吩,如果混用會(huì)出現(xiàn)崩潰敢辩。

4.Masonry的簡(jiǎn)單使用

<1>.簡(jiǎn)單示例

UIView *view = [[UIView alloc] init];
view.backgroundColor = [UIColor redColor];
//一定要先加入父控件,否則報(bào)錯(cuò)
[self.view addSubview:view];
[view mas_makeConstraints:^(MASConstraintMaker *make) {
    make.edges.equalTo(view.superview).insets(UIEdgeInsetsMake(20, 20, 20, 20));
}];
等價(jià)代碼
[view mas_makeConstraints:^(MASConstraintMaker *make) {
    make.left.right.top.bottom.equalTo(view.superview).insets(UIEdgeInsetsMake(20, 20, 20, 20));
}];
等價(jià)代碼
[view mas_makeConstraints:^(MASConstraintMaker *make) {
    make.left.equalTo(view.superview).offset(20);
    make.top.equalTo(view.superview).offset(20);
    make.right.equalTo(view.superview).offset(-20);
    make.bottom.equalTo(view.superview).offset(-20);
}];

注意:鏈?zhǔn)秸Z(yǔ)法中弟疆,and 以及 with都是修飾性語(yǔ)句戚长,不做任何事情,只是便于理解怠苔。

<2>.關(guān)于multipliedBy的使用

//自視圖的寬高是父視圖一半
[view mas_makeConstraints:^(MASConstraintMaker *make) {
    make.left.equalTo(view.superview);
    make.top.equalTo(view.superview).offset(20);
    make.width.height.equalTo(view.superview).multipliedBy(0.5);
}];

<3>.關(guān)于greaterThanOrEqualTo/lessThanOrEqualTo的使用

//寬大于等于200
make.width.greaterThanOrEqualTo(@200);
//寬小于等于200
make.width.lessThanOrEqualTo(@400)

<4>修改指定約束

MASConstraint *topConstraint;
// 在生成約束的時(shí)候
[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
    topConstraint = make.top.equalTo(superview.mas_top);
    make.left.equalTo(superview.mas_left);
}];
// 在之后進(jìn)行對(duì)該約束 進(jìn)行修改
[topConstraint uninstall];

//blcok中進(jìn)行判斷使用約束(在統(tǒng)一處理某些業(yè)務(wù)的時(shí)候)
[self.button mas_remakeConstraints:^(MASConstraintMaker *make) {
    make.size.equalTo(self.buttonSize);
    if (topLeft) {
        make.top.and.left.offset(10);
    } else {
        make.bottom.and.right.offset(-10);
    }
}];

<5>固定寬高

//固定寬高300*300
[view mas_makeConstraints:^(MASConstraintMaker *make) {
    make.center.equalTo(view.superview);
    make.width.height.equalTo(@300);
}];

<6>關(guān)于mas_equalTo/mas_offset()使用

//高度為300的約束中同廉,可以這樣子寫(xiě)
mak.height.equalTo(@300);
//也可以,使用mas_equalTo柑司,一般情況下迫肖,使用mas_equalTo來(lái)處理基本數(shù)據(jù)類(lèi)型的封裝
mak.height.mas_equalTo(300);

如果想使用基礎(chǔ)數(shù)據(jù)類(lèi)型當(dāng)做參數(shù),Masonry為我們提供了"mas_xx"格式的宏定義攒驰。
這些宏定義會(huì)將傳入的基礎(chǔ)數(shù)據(jù)類(lèi)型轉(zhuǎn)換為NSNumber類(lèi)型蟆湖,這個(gè)過(guò)程叫做封箱(Auto Boxing)。
"mas_xx"開(kāi)頭的宏定義讼育,內(nèi)部都是通過(guò)MASBoxValue()函數(shù)實(shí)現(xiàn)的帐姻。
這樣的宏定義主要有四個(gè),分別是mas_equalTo()奶段、mas_offset()和大于等于饥瓷、小于等于四個(gè)。

mas_equalTo其實(shí)是多了一層處理的宏而已痹籍,因?yàn)閑qualTo并不支持基本數(shù)據(jù)類(lèi)型
#define mas_equalTo(...)                equalTo(MASBoxValue((__VA_ARGS__)))

<7>多個(gè)視圖的等高呢铆、等寬、左對(duì)齊蹲缠、下對(duì)齊等的約束

// 表達(dá)三個(gè)視圖等高的約束.
make.height.equalTo(@[view1.mas_height, view2.mas_height]);
make.height.equalTo(@[view1, view2]);
make.left.equalTo(@[view1, @100, view3.right]);

<8>動(dòng)畫(huà)問(wèn)題

//動(dòng)畫(huà)問(wèn)題棺克,和普通的方法實(shí)現(xiàn)差不多,重點(diǎn)只是修改約束后調(diào)用
[view.superview layoutIfNeeded];

[view mas_makeConstraints:^(MASConstraintMaker *make) {
    make.top.mas_equalTo(400);
    make.left.mas_equalTo(100);
    make.size.mas_equalTo(CGSizeMake(100, 100));
}];
//如果其約束還沒(méi)有生成的時(shí)候需要?jiǎng)赢?huà)的話(huà)线定,就請(qǐng)先強(qiáng)制刷新后才寫(xiě)動(dòng)畫(huà)娜谊,否則所有沒(méi)生成的約束會(huì)直接跑動(dòng)畫(huà)
[view.superview layoutIfNeeded];
    [UIView animateWithDuration:3 animations:^{
        [view mas_updateConstraints:^(MASConstraintMaker *make) {
            make.left.mas_equalTo(200);
    }];
    [view.superview layoutIfNeeded];//強(qiáng)制繪制
}];

<9>設(shè)置約束優(yōu)先級(jí)

Masonry為我們提供了三個(gè)默認(rèn)的方法,priorityLow()斤讥、priorityMedium()纱皆、priorityHigh(),這三個(gè)方法內(nèi)部對(duì)應(yīng)著不同的默認(rèn)優(yōu)先級(jí)芭商。
除了這三個(gè)方法派草,我們也可以自己設(shè)置優(yōu)先級(jí)的值,可以通過(guò)priority()方法來(lái)設(shè)置铛楣。

[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); 
}];

Masonry也幫我們定義好了一些默認(rèn)的優(yōu)先級(jí)常量近迁,分別對(duì)應(yīng)著不同的數(shù)值,優(yōu)先級(jí)最大數(shù)值是1000簸州。

static const MASLayoutPriority MASLayoutPriorityRequired = UILayoutPriorityRequired; 
static const MASLayoutPriority MASLayoutPriorityDefaultHigh = UILayoutPriorityDefaultHigh; 
static const MASLayoutPriority MASLayoutPriorityDefaultMedium = 500; 
static const MASLayoutPriority MASLayoutPriorityDefaultLow = UILayoutPriorityDefaultLow;
static const MASLayoutPriority MASLayoutPriorityFittingSizeLevel = UILayoutPriorityFittingSizeLevel;

5.Masonry的注意事項(xiàng)

<1> 使用 mas_makeConstraints方法的元素必須事先添加到父元素的中鉴竭,例如

[self.view addSubview:view];

<2> multipliedBy的使用只能是設(shè)置同一個(gè)控件的歧譬,比如這里的bottomInnerView,

make.height.mas_equalTo(bottomInnerView.mas_width).multipliedBy(3);

<3> 對(duì)label約束必須設(shè)置最大約束的寬度

self.titleLabel.preferredMaxLayoutWidth = w - 100 - 15;

<4> contentView的沖突
如果遇到和contentView的沖突拓瞪,基本原因是因?yàn)閏ell的content view有一個(gè)系統(tǒng)的約束(高度)缴罗,而masonry是不會(huì)去管理非自己產(chǎn)生的約束,因此在使用label imageview等情況下祭埂,增加以下屬性設(shè)置面氓,確保優(yōu)先級(jí)以防止沖突

[_contentLabel setContentHuggingPriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisVertical];

6.Masonry使用問(wèn)題、修改沖突

當(dāng)約束沖突發(fā)生的時(shí)候蛆橡,我們可以設(shè)置view的key來(lái)定位是哪個(gè)

viewredView.mas_key =@"redView";greenView.mas_key = @"greenView";blueView.mas_key = @"blueView";

若是覺(jué)得這樣一個(gè)個(gè)設(shè)置比較繁瑣舌界,怎么辦呢,Masonry則提供了批量設(shè)置的宏

MASAttachKeysMASAttachKeys(redView,greenView,blueView); //一句代碼即可全部設(shè)置泰演。

如果出現(xiàn)什么疑難雜癥的話(huà)呻拌,基本都是AutoLayout在iOS的不適用,所以搜索問(wèn)題的話(huà)睦焕,各位直接搜索Autolayout 關(guān)鍵字便可藐握,不必搜索Masonry的問(wèn)題。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末垃喊,一起剝皮案震驚了整個(gè)濱河市猾普,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌本谜,老刑警劉巖初家,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異乌助,居然都是意外死亡溜在,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)他托,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)掖肋,“玉大人,你說(shuō)我怎么就攤上這事赏参≈玖” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵登刺,是天一觀的道長(zhǎng)籽腕。 經(jīng)常有香客問(wèn)我嗡呼,道長(zhǎng)纸俭,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任南窗,我火速辦了婚禮揍很,結(jié)果婚禮上郎楼,老公的妹妹穿的比我還像新娘。我一直安慰自己窒悔,他們只是感情好呜袁,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著简珠,像睡著了一般阶界。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上聋庵,一...
    開(kāi)封第一講書(shū)人閱讀 49,806評(píng)論 1 290
  • 那天膘融,我揣著相機(jī)與錄音,去河邊找鬼祭玉。 笑死氧映,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的脱货。 我是一名探鬼主播岛都,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼振峻!你這毒婦竟也來(lái)了臼疫?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤铺韧,失蹤者是張志新(化名)和其女友劉穎多矮,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體哈打,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡塔逃,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了料仗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片湾盗。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖立轧,靈堂內(nèi)的尸體忽然破棺而出格粪,到底是詐尸還是另有隱情,我是刑警寧澤氛改,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布帐萎,位于F島的核電站,受9級(jí)特大地震影響胜卤,放射性物質(zhì)發(fā)生泄漏疆导。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一葛躏、第九天 我趴在偏房一處隱蔽的房頂上張望澈段。 院中可真熱鬧悠菜,春花似錦、人聲如沸败富。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)兽叮。三九已至芬骄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鹦聪,已是汗流浹背德玫。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留椎麦,地道東北人宰僧。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像观挎,于是被迫代替她去往敵國(guó)和親琴儿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Masonry是一個(gè)輕量級(jí)的布局框架嘁捷,它擁有自己的描述語(yǔ)法(采用更優(yōu)雅的鏈?zhǔn)秸Z(yǔ)法封裝)來(lái)自動(dòng)布局造成,具有很好可讀性且...
    AngeloD閱讀 3,284評(píng)論 0 9
  • Masonry是一個(gè)輕量級(jí)的布局框架,擁有自己的描述語(yǔ)法雄嚣,采用更優(yōu)雅的鏈?zhǔn)秸Z(yǔ)法封裝自動(dòng)布局晒屎,簡(jiǎn)潔明了并具有高可讀性...
    3dcc6cf93bb5閱讀 1,759評(píng)論 0 1
  • (一)Masonry介紹 Masonry是一個(gè)輕量級(jí)的布局框架 擁有自己的描述語(yǔ)法 采用更優(yōu)雅的鏈?zhǔn)秸Z(yǔ)法封裝自動(dòng)布...
    木易林1閱讀 2,320評(píng)論 0 3
  • [置頂]iOS - Masonry使用中的一些整理 標(biāo)簽:iOS資源大全iOS常用方法iOS學(xué)習(xí)資料Masonry...
    DreamMakerSky閱讀 3,160評(píng)論 0 4
  • 安徒生說(shuō),小美人魚(yú)為了與心愛(ài)的王子在一起缓升,把自己的魚(yú)尾換成了雙腿鼓鲁,卻步步扎心,如同走在刀刃上一般港谊。然而自始至...
    凌遠(yuǎn)遠(yuǎn)閱讀 257評(píng)論 0 0