Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UITableViewCell无法根据其包含的动态集合视图调整高度_Ios_Swift_Uitableview_Uicollectionview - Fatal编程技术网

Ios UITableViewCell无法根据其包含的动态集合视图调整高度

Ios UITableViewCell无法根据其包含的动态集合视图调整高度,ios,swift,uitableview,uicollectionview,Ios,Swift,Uitableview,Uicollectionview,让我从解释视图层次结构开始。 我使用的是普通的UITableView,在UITableView单元格中有一个高度动态的collectionView 如何在UITableView的willDisplay单元格中设置UICollectionView的数据源和委托: func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { if in

让我从解释视图层次结构开始。 我使用的是普通的UITableView,在UITableView单元格中有一个高度动态的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单元也会以某种方式使用相同的高度。滚动表格后,单元格显示正确。

Swift示例

首先,在tableViewCell类中获取collectionViewHeightConstraint的出口,如下所示:-

@IBOutlet weak var collectionViewHeight: NSLayoutConstraint!
然后在ViewController类的viewDidLoad()方法中添加以下tableViewCell动态高度代码:-

myTableView.estimatedRowHeight = 100;  // Default tableViewCell height
myTableView.rowHeight = UITableViewAutomaticDimension;
然后在tableView单元格内添加以下代码,以根据CollectionView高度更新tableView单元格的高度:-

cell.frame = tableView.bounds;  // cell of myTableView
cell.layoutIfNeeded()
cell.myCollectionView.reloadData()
cell.collectionViewHeight.constant = cell.myCollectionView.collectionViewLayout.collectionViewContentSize.height;
希望这有帮助。 快乐编码:)

另一种方法: 将UITableView单元格高度设置为动态后

     tableView.estimatedRowHeight = 100
     tableView.rowHeight = UITableViewAutomaticDimension
  • 为collectionView创建子类并重写intrinsicContentSize

    class DynamicCollectionView: UICollectionView {
        override func layoutSubviews() {
             super.layoutSubviews()
            if !__CGSizeEqualToSize(bounds.size, self.intrinsicContentSize) {
                self.invalidateIntrinsicContentSize()
            }
        }
    
        override var intrinsicContentSize: CGSize {
            return collectionViewLayout.collectionViewContentSize
        }
    }
    
  • 在Interface builder中,将collectionView的类更改为DynamicCollectionView(子类UICollectionView)

  • 设置UICollectionViewFlowLayout的估计单元格大小

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