UITableViewCell无法根据它包含的动态CollectionView调整高度

时间:2018-02-26 10:23:25

标签: ios swift uitableview uicollectionview

让我先解释视图层次结构。 我使用普通的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具有顶部,底部,前导,尾随和高度约束。

Constraints

然后我使用高度约束并将其设置为collectionView高度,如同在UITableView单元子类中一样,

override func layoutSubviews() {

    timingCollectionHeight.constant = timingCollection.collectionViewLayout.collectionViewContentSize.height
}

发生的事情是我的细胞没有正确显示,因为有空格。例如,如果有一个UITableView单元格具有较大高度的collectionView,则其他UITableView单元格也会以某种方式使用相同的高度。滚动表格后,单元格显示正确。

2 个答案:

答案 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
  1. 为collectionView创建一个子类,并覆盖internalContentSize。

    DynamicCollectionView类:UICollectionView {   覆盖func layoutSubviews(){     super.layoutSubviews()     如果!__ CGSizeEqualToSize(bounds.size,self.intrinsicContentSize){         self.invalidateIntrinsicContentSize()      }   }

    覆盖var nativeContentSize:CGSize {     返回collectionViewLayout.collectionViewContentSize    } }

  2. 在“界面”构建器中,将您的collectionView的类更改为DynamicCollectionView(子类UICollectionView)。

  3. 设置UICollectionViewFlowLayout的估计单元格大小。

        flowLayout.estimatedItemSize = CGSize(width: 1,height: 1)