我有一个UICollectionViewCell,它里面有一个UTableView。我想根据其中的内容动态计算UITableView的高度。这意味着,UITableView不应滚动,而应根据其内容增加/减小其高度。
答案 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()
就是这样! :)我希望这会有所帮助!