项目中纯代码配置控件frame后使用tableView的estimateHeight计算失效,发生了高度错乱问题
控制器中预设高度自适应核心代码
tableView
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return UITableViewAutomaticDimension;
}
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 290;
}
iOS8 系统中 rowHeight 的默认值已经设置成了 UITableViewAutomaticDimension,self.tableView.rowHeight = UITableViewAutomaticDimension;可以省略
collectionView
if (@available(iOS 10.0, *)) {
layout.estimatedItemSize=UICollectionViewFlowLayoutAutomaticSize;
} else {
layout.estimatedItemSize=CGSizeMake(kScreenWidth, 26);
}
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
//宽度或者高度一定要 大于 0 ,否则会出现丢失错误等不可预料问题
return CGSizeMake(kScreenWidth, 26);
}
在cell的layoutSubviews
中写的masonry高度约束,垂直方向约束从上到下全都饱满 top bottom 都满足条件情况下出现问题。 上下滑动tableView后cell高度恢复正常。
同样的布局约束写在
initWihStyle
函数中 addSubviews之后
就是正常。另外自定义xib进行拖线Autolayout约束也是正常的,只要约束是正确的,垂直方向约束从上到下的top bottom 都满足,那么系统去根据约束计算的时候就不会出现混乱。否则基本都是约束条件不满足造成的问题。
1552621501703.jpg
代码追踪后猜想的结果是estimate是在所有垂直条件都满足的情况下才能计算出高度,否则用预设高度。并且计算高度的时机是要快于layoutSunview方法的触发的,也就是说在layoutSubview去写约束的话会导致约束滞后,系统计算超前。而且用layoutSubViews方法时需要注意时机:每次label进行赋值的时候或者tableView滑动的时候都会触发layoutSubViews方法。
网友评论