mas_makeConstraints & mas_updateConstraints & mas_remakeConstraints

先簡(jiǎn)單介紹一下凉当,這幾個(gè)方法的使用場(chǎng)景

mas_makeConstraints : 一個(gè)視圖,剛創(chuàng)建出來(lái)茂契,沒(méi)有任何約束。用這個(gè)方法慨绳,給視圖創(chuàng)建 x,y,w,h的約束掉冶。
mas_updateConstraints : 一個(gè)視圖,之前已經(jīng)有約束了脐雪,因?yàn)闂l件變了厌小,需要變位置(x,y),變寬高(w,h),需要修改約束战秋。
mas_remakeConstraints : 一個(gè)視圖璧亚,之前有約束,但之前的約束脂信,全都不要了(x,y,w,h),需要全部重新創(chuàng)建癣蟋。


重點(diǎn)說(shuō)明 mas_updateConstraints

mas_updateConstraints 使用場(chǎng)景是透硝,某個(gè)視圖之前已經(jīng)有 x,y,w,h 約束了。
現(xiàn)在因?yàn)槟承┰蚍杞粒枰薷哪硞€(gè)約束濒生。
比如修改位置 x, y。
修改寬高 w,h幔欧。

但是罪治,mas_updateConstraints 是一直都有效的嗎?

場(chǎng)景一

兩個(gè) view。橙色的 view礁蔗,是父視圖觉义。
紫色的 view 是子視圖。

15295688808788.jpg
UIView *testView = [[UIView alloc] init];
    testView.backgroundColor = [UIColor orangeColor];
    [self.view addSubview:testView];
    [testView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.top.offset(20);
        make.height.width.offset(200);
    }];
    
    _testView = testView;
    
    
    UIView *test2View = [[UIView alloc] init];
    test2View.backgroundColor = [UIColor purpleColor];
    [testView addSubview:test2View];
    [test2View mas_makeConstraints:^(MASConstraintMaker *make) {
         make.left.top.offset(20); // x,y 依賴于父容器
        make.height.offset(100); // width 和父容器沒(méi)有一毛錢關(guān)系
        make.width.offset(100); // height 和父容器沒(méi)有一毛錢關(guān)系
    }];
    
    _testView2 = test2View;

testView2 是子容器浴井,約束設(shè)置的條件是 晒骇,除了 x,y 和父容器有關(guān)系之外(也不可能沒(méi)有關(guān)系)
width & height 都寫(xiě)的是常量,和父容器沒(méi)有任何關(guān)系滋饲。

touchesBegan 測(cè)試 mas_updateConstraints,來(lái)修改 testView2 的 width厉碟,height。
(這個(gè)寬高和父容器沒(méi)有一毛錢關(guān)系)

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    [_testView2 mas_updateConstraints:^(MASConstraintMaker *make) {
        make.width.offset(150);
        make.height.offset(150);
    }];
}

運(yùn)行結(jié)果:

15295690812429.jpg

查看控制臺(tái)屠缭,非常干凈箍鼓,沒(méi)有報(bào)約束沖突的問(wèn)題。

15295691064947.jpg

場(chǎng)景二

還是兩個(gè) view呵曹。橙色的 view款咖,是父視圖。
紫色的 view 是子視圖奄喂。

15295693759982.jpg
    testView.backgroundColor = [UIColor orangeColor];
    [self.view addSubview:testView];
    [testView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.top.offset(20);
        make.height.width.offset(200);
    }];
    
    _testView = testView;
    
    
    UIView *test2View = [[UIView alloc] init];
    test2View.backgroundColor = [UIColor purpleColor];
    [testView addSubview:test2View];
    [test2View mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.top.offset(20); // x,y 依賴于父容器
        
        make.height.equalTo(testView).multipliedBy(0.5);// width 和父容器有關(guān)系了,它是父容器寬度的一半
        make.width.equalTo(testView).multipliedBy(0.5); // height 和父容器有關(guān)系了,它是父容器高度的一半
        
//        make.height.offset(100); // width 和父容器沒(méi)有一毛錢關(guān)系
//        make.width.offset(100); // height 和父容器沒(méi)有一毛錢關(guān)系
       
    }];

    _testView2 = test2View;

現(xiàn)在 testView2width & height 也是約束設(shè)置的铐殃,但是已經(jīng)和父容器建立關(guān)系了。
它們分別是父容器寬高的一半跨新。

現(xiàn)在在使用 mas_updateConstraints 來(lái)更新testView2的寬高約束富腊。

[_testView2 mas_updateConstraints:^(MASConstraintMaker *make) {
        make.width.offset(150);
        make.height.offset(150);
    }];

運(yùn)行結(jié)果:

15295693759982.jpg

testVIew2使用mas_updateConstraints 并沒(méi)有成功的修改自己的寬高(因?yàn)楹透溉萜鹘⒘岁P(guān)系了)

在來(lái)看看控制臺(tái)輸出:

15295694471885.jpg

很不幸的是,控制臺(tái)報(bào)出了約束異常域帐。
mas_updateConstraints 好像赘被,并不是萬(wàn)能的?
不是一句簡(jiǎn)單的 更新視圖的約束就能說(shuō)明白的肖揣。

那如何去修正呢民假?

修正步驟:

  1. 記錄和父容器產(chǎn)生了關(guān)系的約束對(duì)象。
  2. 更新這些約束對(duì)象之前龙优,先把之前的約束對(duì)象卸載羊异。

聲明兩個(gè)約束對(duì)象,width & height

MASConstraint *_heightConstraint; // 子視圖寬度約束
MASConstraint *_widthConstraint; // 子視圖高度約束

記錄和父容器產(chǎn)生了關(guān)系的約束對(duì)象

_heightConstraint = make.height.equalTo(testView).multipliedBy(0.5);
_widthConstraint = make.width.equalTo(testView).multipliedBy(0.5);

在更新這些和父視圖建立了關(guān)系的約束之前,必須先卸載之前的約束對(duì)象野舶。
然后再使用 mas_updateConstraints 更新全新的約束

  - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    [_widthConstraint uninstall]; // 先卸載之前的寬度約束(multipliedBy)
    [_heightConstraint uninstall]; // 先卸載之前的高度約束(multipliedBy)
    [_testView2 mas_updateConstraints:^(MASConstraintMaker *make) {
        make.width.offset(150);
        make.height.offset(150);
    }];
}

運(yùn)行結(jié)果:

15295698322527.jpg

再看看看控制臺(tái):

15295698660922.jpg

非常干凈易迹。沒(méi)有報(bào)任何沖突。

當(dāng)然還有 centerX,centerY 位置相關(guān)的(x,y不沖突平道,不代表 centerX,centerY 不沖突)等約束赴蝇,大家可以自己做測(cè)試看看。


最后結(jié)論:

  1. mas_updateConstraints 并是一個(gè)簡(jiǎn)單的更新視圖約束就能說(shuō)明白的巢掺。
  2. 某些和父親容器建立了約束關(guān)系的約束,在使用 mas_updateConstraints 之前劲蜻,必須先卸載之前的約束陆淀。
  3. 對(duì)于子視圖的 x,y 約束,使用mas_updateConstraints先嬉,總是有效的轧苫。(有人會(huì)說(shuō),x,y 也和父視圖建立了關(guān)系了呀疫蔓?那你能找一個(gè) x,y 和父視圖沒(méi)有建立關(guān)系的約束嗎含懊?)
  4. 對(duì)于父視圖是控制器根 view 的情況下,mas_updateConstraints衅胀。這是因?yàn)楦?view 的大小基本都是定死的岔乔。
  5. 當(dāng)使用mas_updateConstraints遇到約束問(wèn)題時(shí),可以先想想滚躯,是哪些約束事先需要?jiǎng)h除但沒(méi)有刪除的雏门?

一個(gè)比較暴力的解決 在使用 mas_updateConstraints 出現(xiàn)約束沖突的問(wèn)題方法。

更新哪個(gè)約束出沖突了掸掏,就把哪個(gè)約束刪除了茁影,在更新。也省的去研究丧凤,為什么會(huì)出沖突了募闲。
約束本身就是個(gè)比較蛋疼的東西。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末愿待,一起剝皮案震驚了整個(gè)濱河市浩螺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌呼盆,老刑警劉巖年扩,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異访圃,居然都是意外死亡厨幻,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)况脆,“玉大人饭宾,你說(shuō)我怎么就攤上這事「窳耍” “怎么了看铆?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)盛末。 經(jīng)常有香客問(wèn)我弹惦,道長(zhǎng),這世上最難降的妖魔是什么悄但? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任棠隐,我火速辦了婚禮,結(jié)果婚禮上檐嚣,老公的妹妹穿的比我還像新娘助泽。我一直安慰自己,他們只是感情好嚎京,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布嗡贺。 她就那樣靜靜地躺著,像睡著了一般鞍帝。 火紅的嫁衣襯著肌膚如雪诫睬。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,185評(píng)論 1 284
  • 那天膜眠,我揣著相機(jī)與錄音岩臣,去河邊找鬼。 笑死宵膨,一個(gè)胖子當(dāng)著我的面吹牛架谎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播辟躏,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼谷扣,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了捎琐?” 一聲冷哼從身側(cè)響起会涎,我...
    開(kāi)封第一講書(shū)人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瑞凑,沒(méi)想到半個(gè)月后末秃,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡籽御,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年练慕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了惰匙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡铃将,死狀恐怖项鬼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情劲阎,我是刑警寧澤绘盟,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站悯仙,受9級(jí)特大地震影響龄毡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜锡垄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一稚虎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧偎捎,春花似錦、人聲如沸序攘。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)程奠。三九已至丈牢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瞄沙,已是汗流浹背己沛。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留距境,地道東北人申尼。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像垫桂,于是被迫代替她去往敵國(guó)和親师幕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

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