cell 里面嵌套UICollectionView 很多时候都会遇到cell高度的计算问题,和显示不对,复用等一些列问题。直接简单快速解决问题
cell 分为2种,一种是高度自己通过数据去计算,第二种是UITableViewAutomaticDimension 自适应高度
第一种自己计算高度
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{}
如果cell里面套用的UICollectionView 比较简单,然后自己通过传递给cell 的数据,根据布局的一些常量,提前计算出cell的高度。然后缓存起来刷新,这个方法有的时候计算容易疏漏一些间距,计算起来麻烦,如果界面变的复杂了,或者是瀑布流,计算起来更加麻烦。所以推荐第二种快速自适应高度
第二种快速自适应高度高度
_tableView.estimatedRowHeight = 100;
_tableView.rowHeight = UITableViewAutomaticDimension;
设置了这个之后。在cell 里面添加UICollectionView 的时候布局需要注意的是必须设置一个宽度,要不然这个时候cell默认的宽度一直是320.
- (void)setupUI{
[self.contentView addSubview:self.collectionView];
[self.collectionView mas_makeConstraints:^(MASConstraintMaker *make) {
make.bottom.top.mas_equalTo(self.contentView);
//// 默认先随便一个值吧,最好接近真实值,
make.height.mas_equalTo(200);
make.width.mas_equalTo(SCREEN_WIDTH);
// // 这里需要指定宽度,因为collectionView布局的时候,tableView的cell的frame还没有正确设置还是estimate
}];
}
好的接下来就是重写systemLayoutSizeFittingSize 的方法。
- (CGSize)systemLayoutSizeFittingSize:(CGSize)targetSize withHorizontalFittingPriority:(UILayoutPriority)horizontalFittingPriority verticalFittingPriority:(UILayoutPriority)verticalFittingPriority{
CGSize size = [super systemLayoutSizeFittingSize:targetSize withHorizontalFittingPriority:horizontalFittingPriority verticalFittingPriority:verticalFittingPriority];
[self.collectionView layoutIfNeeded];
CGFloat heigth = self.collectionView.collectionViewLayout.collectionViewContentSize.height;
return CGSizeMake(size.width, heigth);
}
然后强制刷新self.collectionView 后,就可以获得collectionView 的真实高度,打印查看调用顺序。会再次去刷新- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 的方法,撑开cell。就非常完美的布局好了。