iOS10.0系統(tǒng)發(fā)布后并齐,做了一些簡單的適配工作(權(quán)限独悴,UILabel的大小耸袜,導(dǎo)航欄的tintColor等)扇谣,進(jìn)行新版本測試突然發(fā)現(xiàn)自動布局不好使了昧捷。項(xiàng)目中很多地方用到了自適應(yīng)cell,在iOS10.0之前都是完美運(yùn)行的罐寨。如果此時換成手動計(jì)算高度實(shí)現(xiàn)自適應(yīng)靡挥,這個工程量還是比較大的。無奈研究了一晚上鸯绿,終于找到了在iOS10下關(guān)于Masonry實(shí)現(xiàn)自適應(yīng)的解決辦法跋破。
一、網(wǎng)上查找的一種處理方法--調(diào)整代碼
這是之前在10.0下出問題的代碼
[viewBG mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.contentView).offset(10*ScaleScreenH);
make.right.equalTo(self.contentView).offset(-10*ScaleScreenH);
make.top.equalTo(self.contentView);
make.height.equalTo(@(viewBG.height));
}];
[self.contentView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self);
make.right.equalTo(self);
make.top.equalTo(self);
make.bottom.equalTo(viewBG).offset(15*ScaleScreenH);
}];
只需要做一個調(diào)整瓶蝴,對于viewBG的底部約束毒返,不能寫在contentView的約束里了。至于為什么囊蓝,我也不清楚饿悬。
[viewBG mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.contentView).offset(10*ScaleScreenH);
make.right.equalTo(self.contentView).offset(-10*ScaleScreenH);
make.top.equalTo(self.contentView);
make.height.equalTo(@(viewBG.height));
make.bottom.equalTo(self.contentView).offset(-15*ScaleScreenH);
}];
[self.contentView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self);
}];
二令蛉、文字自適應(yīng)
方法一中聚霜,viewBG的高度是已知的,可以通過高度進(jìn)行約束珠叔。
如果你的代碼中是使用label的文字自適應(yīng)蝎宇, 那么就有問題了,你需要去手動計(jì)算文字的高度祷安,再進(jìn)行高度適配
如下這種需求(文字無關(guān)姥芥,隨便復(fù)制的)
在iOS10之前,我的代碼是這樣寫的:
// 布局
[self.label mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.contentView).offset(10);
make.left.equalTo(self.contentView).offset(16);
make.right.equalTo(self.contentView).offset(-16);
}];
[self.contentView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.left.right.equalTo(self);
make.bottom.equalTo(self.label.mas_bottom).offset(10);
}];
出現(xiàn)的問題:每個label的高度都為0汇鞭,顯示無任何內(nèi)容
根據(jù)方法一進(jìn)行修改后
// 布局
[self.label mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.contentView).offset(10);
make.left.equalTo(self.contentView).offset(16);
make.right.equalTo(self.contentView).offset(-16);
make.bottom.equalTo(self.contentView).offset(-10);
}];
[self.contentView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self);
}];
文字的高度都不正確凉唐,全部都只有一行,當(dāng)cell滾動界面再出現(xiàn)時霍骄,才正確
通過調(diào)試發(fā)現(xiàn)台囱,iOS10之前, layoutSubViews方法在cell初始化時就會調(diào)用兩次读整, 而iOS10之后簿训, layoutSubViews方法只會調(diào)用一次
解決方法:1.與方法一配合使用,計(jì)算文字的高度,進(jìn)行高度約束
2.手動使用layoutSubViews多走一次强品,就可得到正確的高度
- (void)setText:(NSString *)text {
_text = text;
self.label.text = text;
// 自動適配并重新布局
[self.label sizeToFit];// 可以得到label的正確高度
[self layoutIfNeeded];//會重新調(diào)用一次LayoutSubViews
}
結(jié)果恢復(fù)正常