一、源起
最近在使用Masory做動態(tài)布局的時候叉信,發(fā)現(xiàn)一個問題什乙。
首先列舉下我的當(dāng)時的做法液肌。
做法一。
在Cell的復(fù)用方法里添加子控件
-(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
if (self =[super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
[self.contentView addSubview:self.oneLabel];
[self.contentView addSubview:self.TwoImageView];
}
return self;
}
在layoutSubviews方法里面進(jìn)行約束設(shè)置 當(dāng)然懶加載的代碼就不多寫了
這里的需求是前面一個label 后面一個imageView 同行顯示。imageView的X需要由label內(nèi)容來確定。
-(void)layoutSubviews {
[super ayoutSubviews];
//這里設(shè)置約束代碼
[self.oneLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.contentView).offset(16);
make.top.equalTo(self.contentView).offset(20);
make.height.mas_equalTo(24);
}];
[self.TwoImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.oneLabel).offset(4);;
make.width..mas_equalTo(56);
make.height.mas_equalTo(17);
make.center.equalTo(self.oneLabel);
}];
}
給cell賦值model 并重新設(shè)置約束
-(void)setModel:(Model*)model {
self.oneLabel.text = @"這里做一個測試數(shù)據(jù)的展示";
//這里設(shè)置約束代碼
//更新約束
[self.oneLabel update_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.contentView).offset(16);
make.top.equalTo(self.contentView).offset(20);
make.height.mas_equalTo(24);
}];
[self.TwoImageView update_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.oneLabel).offset(4);;
make.width..mas_equalTo(56);
make.height.mas_equalTo(17);
make.center.equalTo(self.oneLabel);
}];
}
以上方式出來之后 發(fā)現(xiàn)oneLabel不顯示豹悬。TwoImageView顯示錯位了。
嘗試修改一:
[self.oneLabel re_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.contentView).offset(16);
make.top.equalTo(self.contentView).offset(20);
make.height.mas_equalTo(24);
}];
[self.TwoImageView re_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.oneLabel.mas_right).offset(4);;
make.width..mas_equalTo(56);
make.height.mas_equalTo(17);
make.center.equalTo(self.oneLabel);
}]液荸;
}
仍舊無效屿衅,并且控制臺不斷輸出約束報錯信息。
嘗試修改二:
-(void)layoutSubviews {
[super ayoutSubviews];
//這里設(shè)置約束代碼
[self.oneLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.contentView).offset(16);
make.top.equalTo(self.contentView).offset(20);
make.height.mas_equalTo(24);
}];
/去掉設(shè)置imageView的約束 等到拿到數(shù)據(jù)后在重新設(shè)置莹弊。
}
仍然無效涤久。還是oneLabel還是不顯示。
嘗試修改三:
在賦值處修改用frame給self.TwoImageView布局 且不重新設(shè)置oneLabel的約束
-(void)setModel:(Model*)model {
self.oneLabel.text = @"這里做一個測試數(shù)據(jù)的展示";
DLog(@"..self.oneLabel.frame==%@",NSStringFromCGRect(self.oneLabel.frame));
self.TwoImageView.frame = CGRectMake(CGRectGetMaxX(self.oneLabel.frame)+4,CGRectGetMinY(self.oneLabel.frame)+4,56,17);
DLog(@"..self.TwoImageView.frame==%@",NSStringFromCGRect(self.TwoImageView.frame));
打印出來數(shù)據(jù)會出現(xiàn)寬度和高度為0 的情況忍弛。導(dǎo)致self.TwoImageView.frame設(shè)置出來也有誤差响迂。
這樣在滑動復(fù)用的時候就出現(xiàn)了 遮蓋問題。
}
最后翻閱了一些資料 如何能夠很好把一下幾個點(diǎn)結(jié)合起來(懶加載布局Cell子控件细疚,在layoutSubviews中寫約束蔗彤,Cell內(nèi)部有動態(tài)且依賴的組件塊,純Masory動態(tài)布)
這幾個點(diǎn)都結(jié)合起來的方法 還是沒有翻閱到疯兼。
當(dāng)然查詢還是有收獲的然遏。
借鑒了一下文章:https://juejin.im/post/5a3238876fb9a0451c3a6af7,https://blog.csdn.net/MinggeQingchun/article/details/102677233
改造了下實(shí)現(xiàn)方法吧彪。還是正確處理這個問題了待侵。
以下是改動點(diǎn)。
- 這個新增一個約束方法 添加控件之后做約束姨裸,不在-(void)layoutSubviews里面去做秧倾。
-(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
if (self =[super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
[self.contentView addSubview:self.oneLabel];
[self.contentView addSubview:self.TwoImageView]怨酝;
[self masoryForSubViews];
}
return self;
}
-(void)masoryForSubViews {
//這里設(shè)置約束代碼
[self.oneLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.contentView).offset(16);
make.top.equalTo(self.contentView).offset(20);
make.height.mas_equalTo(24);
}];
//這里只對oneLabel做了約束
}
2.改造賦值方法
-(void)setModel:(Model*)model {
self.oneLabel.text = @"這里做一個測試數(shù)據(jù)的展示";
//這個方法使得self.oneLabel 約束完畢的frame不再為0
[self layoutIfNeeded];
DLog(@"..self.oneLabel.frame==%@",NSStringFromCGRect(self.oneLabel.frame));
//用frame給TwoImageView 設(shè)置frame
self.TwoImageView.frame = CGRectMake(CGRectGetMaxX(self.oneLabel.frame)+4,CGRectGetMinY(self.oneLabel.frame)+4,56,17);
DLog(@"..self.TwoImageView.frame==%@",NSStringFromCGRect(self.TwoImageView.frame));
}
這樣的話 這個問題也可以正常展示。打印出來的frame和展示出來都是正確的那先。
問題是解決了农猬,還是對懶加載布局Cell子控件、在layoutSubviews中寫約束售淡、Cell內(nèi)部有動態(tài)且依賴的組件塊斤葱、純Masory動態(tài)布
、這幾個條件同事存在情況下 如何處理比較有疑問揖闸。這里先記錄下這個問題揍堕。如果有幸這篇文章能被哪位大神看到,還希望大神能給予指點(diǎn)楔壤。