UIcollectionViewCell内UITableView的动态高度

时间:2018-12-29 16:29:37

标签: ios swift uitableview uicollectionview

我有一个UICollectionViewCell,它里面有一个UTableView。我想根据其中的内容动态计算UITableView的高度。这意味着,UITableView不应滚动,而应根据其内容增加/减小其高度。

2 个答案:

答案 0 :(得分:0)

您可以使用如下所示的自调整表视图:

macro_rules! test {
    ($name:ident: $count:expr) => { test!($name: $count, $) };

    ($name:ident: $count:expr, $dol:tt) => {
        macro_rules! $name {
            ($dol($v:expr),*) => {}
        }
    };
}

fn main() {
    test!(yo: 2);
    yo!(42);
}

此外,您必须确保在集合视图单元格中正确设置约束(从集合视图单元格的顶部到其底部的全套约束)。

答案 1 :(得分:0)

我去过那里。有多种方法可以做到这一点,特别是如果您的行确实具有恒定的高度,那应该很容易。将行数乘以恒定的高度,瞧,您的tableView高度就可以了。

但是,如果您在collectionViewCell或tableViewCell(它们相同)中具有tableView的动态单元格高度,则需要另一种方法。

我的解决方法是观察keyPath contentSize。这是完美的,我在我的主要生产项目中一直在使用它。这是我使用的完整代码块,包括注释/文档;)

/**
 Important Notes, as of 12/18/2018, 9:41PM, a eureka moment:
 - No need for label height.
 - Needs a reference for tableViewHeight.
 - After observing the newSize data, update the constraint's offset of the tableViewHeight reference.
 - And then let know the controller to not reload the data of the tableView but rather begin and end updates only.
 - beginUpdate() and endUpdate() lets the tableView to update the layout without calling the cellForRow, meaning without calling the setupCell method.
*/
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    if let obj = object as? LLFTableView, obj.tag == 444 {
        if obj == self.tableView && keyPath == "contentSize" {
            if let newSize = change?[NSKeyValueChangeKey.newKey] as? CGSize {
                // Edit heightOfTableViewConstraint's constant to update height of table view
                llfPrint("New Size of the tableView: \(newSize) ✅✅✅✅✅")
                DispatchQueue.main.async {
                    self.constraint_TableViewHeight?.update(offset: newSize.height)
                    self.delegate?.reloadData()
                }
            }
        }
    }
}

那么,在实现此类reloadData委托方法的控制器或viewModel中会发生什么?它调用了另一个委托方法,只是让我们知道要更新单元格高度的控制器(其中包含超级tableView)。

self.tableView.beginUpdates()
self.tableView.endUpdates()

就是这样! :)我希望这会有所帮助!