iOS tableViewCell嵌套UICollectionView 自适应高度,最简单的方法

3,175 阅读1分钟

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。就非常完美的布局好了。

1571631160546_.pic_hd.jpg