自动调整嵌入在 UITableView 中的 UICollectionView 单元格不起作用

Autosizing UICollectionView cell embedded in UITableView not working

我已经花了几天时间尝试各种 SO 帖子中建议的事情,但一直无法弄清楚。我可能正在寻找正确的问题!

我正在从 Android 切换到 iOS,自动布局似乎遇到了一些问题。具体来说,让 UICollectionView 调整大小以适应其内容的高度。每个集合视图可以根据其内容具有不同的单元格大小,但给定行上的每个项目的单元格大小将相同。

UICollectionView 嵌套在 UITableViewCell 中。 UITableViewCells 似乎正在正确调整其内容高度,查看 Debug View Hierarrchy 问题似乎是 UICollectionView。

我创建了一个迷你演示并将其放在这个 github 上(下面的 link)。我已经投入了一堆测试数据,所以 ViewController VC 的底部有点乱。该演示只是说明了每一行如何具有不同的内容大小。同一样式可以有多个 table 行。

注意:我必须将以下行添加到 CategoryRowCell.swift 才能获得以下屏幕截图。如果没有这条线,UICollectionView 高度将变为 0!

...
collectionView.heightAnchor.constraint(equalToConstant: 250)
...

GitHub link

所以这是现在的样子..

向下滚动

注意水平列表顶部和底部的空隙。这就是我所期待的..

这是调试视图层次结构的一部分。你会看到集合视图已经有了顶部和底部边距(很好),但是红线显示了应用到集合视图的多余高度。绿线表示我期望的高度。我希望集合视图具有其内容的高度。

我认为最好反过来,将 UICollectionView 作为父项,将 UITableView 作为子项。因为第一个更灵活和可定制。

无论如何,对于你的情况,我认为你需要看两件事:

1- 要更好地控制单元格大小,您可以将此函数用于 UICollectionView:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: IndexPath) -> CGSize { 

  // The desired size based on the value at that row (the name for example)

  if objects[indexPath.row].name == "some condition" {
    return CGSize(width: 150, height: 50)
  }
  else {
    return CGSize(width: UIScreen.main.bounds.width, height: 75)
  }


}

2- UICollectionView 和 UITableView 的大小检查器值(其中之一可能有一些额外的间距)