今天在優(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)論界面,如圖,


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


其實(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