让我先解释视图层次结构。 我使用普通的UITableView,在UITableViewCell中有一个动态高度的collectionView。
我如何在UITableView的willDisplay单元格中为UICollectionView设置数据源和委托:
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
if indexPath.section == 0 {
guard let collectionCell = cell as? movieListingTableViewCell else { return }
collectionCell.setCollectionViewDataSourceDelegate(self, forRow: indexPath.row)
collectionCell.selectionStyle = .none
}
}
collectionView具有顶部,底部,前导,尾随和高度约束。
然后我使用高度约束并将其设置为collectionView高度,如同在UITableView单元子类中一样,
override func layoutSubviews() {
timingCollectionHeight.constant = timingCollection.collectionViewLayout.collectionViewContentSize.height
}
发生的事情是我的细胞没有正确显示,因为有空格。例如,如果有一个UITableView单元格具有较大高度的collectionView,则其他UITableView单元格也会以某种方式使用相同的高度。滚动表格后,单元格显示正确。
答案 0 :(得分:1)
Swift示例
首先,在tableViewCell类中获取collectionViewHeightConstraint的插座,如下所示: -
@IBOutlet weak var collectionViewHeight: NSLayoutConstraint!
然后在ViewController类的viewDidLoad()方法中添加下面的tableViewCell动态高度代码: -
myTableView.estimatedRowHeight = 100; // Default tableViewCell height
myTableView.rowHeight = UITableViewAutomaticDimension;
然后在tableView中使用cellForRowAtindexPath委托添加以下代码,根据CollectionView高度更新tableView Cell的高度: -
cell.frame = tableView.bounds; // cell of myTableView
cell.layoutIfNeeded()
cell.myCollectionView.reloadData()
cell.collectionViewHeight.constant = cell.myCollectionView.collectionViewLayout.collectionViewContentSize.height;
希望这会有所帮助。 快乐编码:)
答案 1 :(得分:0)
另一种方法: 将UITableView单元格高度设置为动态后。
tableView.estimatedRowHeight = 100
tableView.rowHeight = UITableViewAutomaticDimension
为collectionView创建一个子类,并覆盖internalContentSize。
DynamicCollectionView类:UICollectionView { 覆盖func layoutSubviews(){ super.layoutSubviews() 如果!__ CGSizeEqualToSize(bounds.size,self.intrinsicContentSize){ self.invalidateIntrinsicContentSize() } }
覆盖var nativeContentSize:CGSize { 返回collectionViewLayout.collectionViewContentSize } }
在“界面”构建器中,将您的collectionView的类更改为DynamicCollectionView(子类UICollectionView)。
设置UICollectionViewFlowLayout的估计单元格大小。
flowLayout.estimatedItemSize = CGSize(width: 1,height: 1)