UICollectionVIew在UITableViewCell里面如何通过autolayout获得动态高度

时间:2014-06-12 11:05:19

标签: ios uitableview autolayout uicollectionviewcell

我知道有类似的question,但我想提供更多关于我是如何尝试实现这一点的提示,因为原始问题没有给出任何建议。
我有一个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:这可能是因为单元格仍未显示。 有工作吗?

1 个答案:

答案 0 :(得分:0)

我建议你为collectionView创建一个高度约束。

然后,根据单元格数量,您可以计算单元格的高度,最后更新该约束并调用 [collectionView setNeedsUpdateConstraints]