今天在優(yōu)化項(xiàng)目中一個(gè)界面的時(shí)候,涉及到masonry布局中添加約束的幾種方式的問題捧书,masonry中給一個(gè)View添加約束有這幾種方式,
mas_makeConstraints
mas_updateConstraints
mas_remakeConstraints
虏束,可能大家常用mas_makeConstraints 這種方式桶癣, 并且對其他幾種不是特別清楚, 這里具體的舉例說一下句旱, 可直接拉到底部看結(jié)論
1. 項(xiàng)目中遇到的問題
先來說一下項(xiàng)目中遇到的問題阳藻, 有這樣一個(gè)評論界面,如圖谈撒,
內(nèi)部的View不是一定有腥泥,比如昵稱右側(cè)的年齡,性別啃匿, 頭像下方的消費(fèi)信息粉色的View蛔外,評論正文下面的圖片蛆楞, 這樣在tableview的Cell復(fù)用中就可能出問題, 一般可以remove重新創(chuàng)建夹厌, 也可以各種hidden=YES/=NO豹爹, 這些都是常規(guī)的處理, 但是做完這些處理之后矛纹, 顯示出來的效果卻是這個(gè)鬼樣子臂聋。。或南。
其實(shí)這兩種效果中間只差了一個(gè)re孩等,就是mas_makeConstraints 和
mas_remakeConstraints , 把所有的make換成remake就可以了
2. 通過示例講解mas_make/mas_update/mas_remake
其實(shí)對一個(gè)View布局采够, 添加方式的區(qū)別就是這個(gè)View是不是已經(jīng)約束肄方, 有的話新加的要怎么處理的問題, 以下示例分三種方面研究蹬癌,
1权她, View已有A類型約束, 又添加A類型約束逝薪。
2隅要, View沒有A類型約束, 又添加A類型約束董济。
3拾徙, 新添加的時(shí)候是否刪除已有約束。
代碼大體如下感局, 改動嘗試即可
- (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不會變化, 即
1询微, 已有size約束崖瞭, 再添加size約束, 不修改
2撑毛, 將初始的size移除掉书聚, 其他不變, 會發(fā)現(xiàn)屏幕上本來沒有View(因?yàn)闆]有size)藻雌, 2秒后出現(xiàn)200*100View雌续, 即沒有size約束, 添加size胯杭, 會更新這個(gè)約束
3驯杜, 將dispatch_after約束變成只有make.size.mas_equalTo(CGSizeMake(200, 100));
, 2秒后無變化, 說明不會刪除已有約束
其他兩種按這種方式試一試就清楚了做个, 下面直接給出結(jié)論鸽心,
make | update | remake | |
---|---|---|---|
已有某類型約束滚局,再添加 | 不更新 | 更新 | 更新 |
沒有某類型約束,再添加 | 更新 | 更新 | 更新 |
是否刪除已有約束 | 不刪除 | 不刪除 | 全刪 |
簡而言之顽频, make用第一次添加的藤肢, update用最新的, remake不光用最新的還得把老的全干掉糯景, 再看項(xiàng)目中的問題嘁圈, 就是復(fù)用的Cell內(nèi)部的View已有約束, 還用make添加蟀淮, 不更新丑孩, 換remake即可
<br />
masonry系列其他文章
基本使用 http://www.reibang.com/p/b5fe6c20f162
等間距布局 http://www.reibang.com/p/2c7a5ba73fc2
demo地址 https://github.com/CoderLXWang/HowToUseMasonry