渲染后更新单元格高度

时间:2017-04-06 13:01:01

标签: ios swift uitableview cocoa-touch xib

我已设置UITableViewCell UITableViewAutomaticDimension TableViewCell中嵌入了一个UICollectionView,它不可滚动但可以根据collectionview的内容具有可变高度。

我现在尝试的是渲染单元格并将collectionview的高度约束赋值给变量collectionViewHeightConstraint,然后在layoutSubviews方法中呈现collectionview后更新高度

override func layoutSubviews() {
    super.layoutSubviews()
    self.collectionViewHeightConstraint?.constant = self.collectionView!.contentSize.height
}

这就是collectionview约束的样子(使用制图):

    self.contentView.addSubview(self.collectionview)   
    self.contentView.addSubview(self.holdingView)
    constrain(self.holdingView!, self.contentView) {
        holderView, container in
        holderView.top == container.top
        holderView.left == container.left
        holderView.right == container.right
        holderView.bottom == container.bottom
    }
    constrain(self.collectionView!, self.holdingView) {
        collectionView, containerView in
        collectionView.top == containerView.top
        collectionView.left == containerView.left
        collectionView.right == containerView.right
        collectionViewHeightConstraint = collectionView.height == collectionViewHeight
        containerView.bottom == collectionView.bottom
    }

但这似乎没有更新细胞高度。

有没有办法更新相同的?

修改
这不是一些人所建议的重复问题,为什么在下面的评论中有解释。

3 个答案:

答案 0 :(得分:2)

由于评论空间太小,我会把所有内容放在这里:

注意:您实际上不必在viewDidLayoutSubviews中设置高度限制,您可以确定UICollectionView已设置和< / strong>您的布局已在整个屏幕上正确设置!例如,在viewDidAppear中执行此操作然后调用layoutIfNeeded()也可以。将其移至viewDidAppear只有在调用UICollectionView之前进行viewDidAppear设置时才会有效,即您事先知道UICollectionView数据源。

修复1:

设置高度并检查heightConstant != contentSize后是否尝试重新加载UITableView。用它来检查UICollectionView的高度是否正确更新,即:

override func layoutSubviews() {
    super.layoutSubviews()

    if self.collectionViewHeightConstraint?.constant != self.collectionView!.contentSize.height{

        self.collectionViewHeightConstraint?.constant = self.collectionView!.contentSize.height

        //to make sure height is recalculated
        tableView.reloadData()
        //or reload just the row depending on use case and if you know the index of the row to reload :)
    }
}

我同意你的意见并且它很混乱,我的意思是将其用作修复和/或检查问题是否真的存在!

至于为什么它为0,可能是因为您的UICollectionView尚未设置(cellForItem尚未调用),因此contentSize实际上并未计算!

修复2:

一旦设置dataSource的{​​{1}},即您收到数据,就会计算UICollectionView contentSize手动设置的高度并设置一次并重新加载该行。如果计算是一项繁琐的任务,只需设置dataSource并在UICollectionView上调用reloadData。这将确保正确设置UICollectionView,然后将单元格的约束设置为UICollectionView,并在contentSize上调用reloadDatareloadRow。< / p>

您基本上可以在UITableView设置 并且您的视图布局之后随时设置heightConstraint。您只需要事后调用UICollectionView

答案 1 :(得分:0)

您可以重新加载tableview的特定单元格

let indexPath = IndexPath(item: rowNumber, section: 0)
    tableView.reloadRows(at: [indexPath], with: .top)

答案 2 :(得分:0)

根据您的要求,我想如果我们先加载集合视图,然后使用正确的集合视图高度加载tableview,我们就可以解决这个问题。

collectionView.reloadData()
        dispatch_async(dispatch_get_main_queue(), { () -> Void in
            self.collectionViewHeightConstraint?.constant = self.collectionView!.contentSize.height
        })
tableview.reloadData()

当tableview加载时,单元格具有基于集合视图内容大小的所需高度。