添加約束mas_make/mas_update/mas_remake的區(qū)別 - 從0開(kāi)始說(shuō)一下masonry的使用

今天在優(yōu)化項(xiàng)目中一個(gè)界面的時(shí)候,涉及到masonry布局中添加約束的幾種方式的問(wèn)題,masonry中給一個(gè)View添加約束有這幾種方式,
mas_makeConstraints
mas_updateConstraints
mas_remakeConstraints
,可能大家常用mas_makeConstraints 這種方式, 并且對(duì)其他幾種不是特別清楚, 這里具體的舉例說(shuō)一下, 可直接拉到底部看結(jié)論

1. 項(xiàng)目中遇到的問(wèn)題

先來(lái)說(shuō)一下項(xiàng)目中遇到的問(wèn)題, 有這樣一個(gè)評(píng)論界面,如圖,

Paste_Image.png
Paste_Image.png

內(nèi)部的View不是一定有,比如昵稱右側(cè)的年齡,性別, 頭像下方的消費(fèi)信息粉色的View,評(píng)論正文下面的圖片, 這樣在tableview的Cell復(fù)用中就可能出問(wèn)題, 一般可以remove重新創(chuàng)建, 也可以各種hidden=YES/=NO, 這些都是常規(guī)的處理, 但是做完這些處理之后, 顯示出來(lái)的效果卻是這個(gè)鬼樣子。。。

Paste_Image.png
Paste_Image.png

其實(shí)這兩種效果中間只差了一個(gè)re,就是mas_makeConstraints 和
mas_remakeConstraints , 把所有的make換成remake就可以了

2. 通過(guò)示例講解mas_make/mas_update/mas_remake

其實(shí)對(duì)一個(gè)View布局, 添加方式的區(qū)別就是這個(gè)View是不是已經(jīng)約束, 有的話新加的要怎么處理的問(wèn)題, 以下示例分三種方面研究,
1, View已有A類型約束, 又添加A類型約束。
2, View沒(méi)有A類型約束, 又添加A類型約束。
3, 新添加的時(shí)候是否刪除已有約束。

代碼大體如下, 改動(dòng)嘗試即可

- (void)test {
    WS(ws);
    
    UIView *redView = [[UIView alloc] init];
    redView.backgroundColor = [UIColor redColor];
    [self.view addSubview:redView];
    [redView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(ws.view).offset(100);
        make.left.equalTo(ws.view).offset(100);
        make.size.mas_equalTo(CGSizeMake(100, 100));
    }];
    
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

        [redView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.top.equalTo(ws.view).offset(100);
            make.left.equalTo(ws.view).offset(100);
            make.size.mas_equalTo(CGSizeMake(200, 100));
        }];
        
        [self.view setNeedsLayout];
        [self.view layoutIfNeeded];
    });
}

先看mas_makeConstraints , 只有size的寬度變了, 這種情況View不會(huì)變化, 即
1, 已有size約束, 再添加size約束, 不修改
2, 將初始的size移除掉, 其他不變, 會(huì)發(fā)現(xiàn)屏幕上本來(lái)沒(méi)有View(因?yàn)闆](méi)有size), 2秒后出現(xiàn)200*100View, 即沒(méi)有size約束, 添加size, 會(huì)更新這個(gè)約束
3, 將dispatch_after約束變成只有make.size.mas_equalTo(CGSizeMake(200, 100));, 2秒后無(wú)變化, 說(shuō)明不會(huì)刪除已有約束

其他兩種按這種方式試一試就清楚了, 下面直接給出結(jié)論,

make update remake
已有某類型約束,再添加 不更新 更新 更新
沒(méi)有某類型約束,再添加 更新 更新 更新
是否刪除已有約束 不刪除 不刪除 全刪
簡(jiǎn)而言之, make用第一次添加的, update用最新的, remake不光用最新的還得把老的全干掉, 再看項(xiàng)目中的問(wèn)題, 就是復(fù)用的Cell內(nèi)部的View已有約束, 還用make添加, 不更新, 換remake即可

<br />


masonry系列其他文章

基本使用 http://www.itdecent.cn/p/b5fe6c20f162
等間距布局 http://www.itdecent.cn/p/2c7a5ba73fc2
demo地址 https://github.com/CoderLXWang/HowToUseMasonry

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • iOS_autoLayout_Masonry 概述 Masonry是一個(gè)輕量級(jí)的布局框架與更好的包裝AutoLay...
    指尖的跳動(dòng)閱讀 1,307評(píng)論 1 4
  • Masonry是一個(gè)輕量級(jí)的布局框架,擁有自己的描述語(yǔ)法,采用更優(yōu)雅的鏈?zhǔn)秸Z(yǔ)法封裝自動(dòng)布局,簡(jiǎn)潔明了并具有高可讀性...
    3dcc6cf93bb5閱讀 1,925評(píng)論 0 1
  • (一)Masonry介紹 Masonry是一個(gè)輕量級(jí)的布局框架 擁有自己的描述語(yǔ)法 采用更優(yōu)雅的鏈?zhǔn)秸Z(yǔ)法封裝自動(dòng)布...
    木易林1閱讀 2,573評(píng)論 0 3
  • 前言 1 MagicNumber->autoresizingMask->autolayout 以上是純手寫代碼所經(jīng)...
    Daimer閱讀 527評(píng)論 0 2
  • 要對(duì)生活抱以溫柔
    大臉狐咩閱讀 91評(píng)論 0 0

友情鏈接更多精彩內(nèi)容