如何使用自动布局在UITableViewCell中获取动态高度的UICollectionVIew?

4

我知道有一个类似的问题,但我想提供更多关于我如何尝试实现它的提示,因为原始问题没有提供任何建议。
我有一个UITableViewCell作为contentView的子视图,其中有一个 UICollectionView,我想让单元格高度与集合视图的 contentSize 相关,表格视图单元格是集合视图的代理和数据源。
集合视图应该在垂直方向上固定且不能滚动,并且应该根据单元格行数自适应其高度。
为了做到这一点,我尝试使用常规表格视图单元格的相同技术。我创建一个虚拟单元格并保留对它的引用,然后在方法- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath中将数据传递给单元格以显示它,然后询问其压缩大小的高度。
就像这样:

- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    CGSize  size = CGSizeZero;
    NSDictionary * data = self.data[indexPath.row];
    if (data[KEY_CELL_IDENTIFIER] == CellIdentifierPost) {
        NSNumber * cachedHeight = [self.heightCaches objectForKey:[(PostObject*)data[KEY_CELL_DATA] postObjectId]];
        if (cachedHeight) {
            return (CGFloat)[cachedHeight doubleValue];
        }
        [_heightCell configureCellWith:data[KEY_CELL_DATA]];
        size = [_heightCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
        [self.heightCaches setObject:@(size.height) forKey:[(PostObject*)data[KEY_CELL_DATA] postObjectId]];
    }
    else if (data[KEY_CELL_IDENTIFIER] == CellIdentifierComment){
        size = (CGSize) {
            .width = NSIntegerMax,
            .height = 160.f
        };
    }
    else {
        size = (CGSize) {
            .width = NSIntegerMax,
            .height = 50.f
        };
    }

    return size.height;
}

这个方法对于其他单元格非常有效,但对于这个单元格却不行,结果是一个几乎没有高度的完全压缩的单元格。
问题似乎是由于内部单元格的放置造成的。即使在提供数据后我强制集合视图重新加载数据,它似乎从未调用-collectionView:cellForItemAtIndexPath:,这可能是因为单元格仍未显示。
有没有解决办法?


所有的集合视图单元格高度都相同吗? - rvijay007
1
我会为你的UICollectionView添加一个高度限制。将高度设置为单元格大小加上你想要的任何间距。 - rvijay007
这就是重点,高度应该是单元格数量的函数。 - Andrea
1个回答

0
我建议您为collectionView创建一个高度约束。
然后,根据单元格的数量,您可以计算其高度,并在最后更新该约束并调用[collectionView setNeedsUpdateConstraints]。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接