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

Posted

技术标签:

【中文标题】UITableViewCell 无法根据它包含的动态 CollectionView 调整高度【英文标题】:UITableViewCell not able to adjust height based on the dynamic CollectionView it contains 【发布时间】:2018-02-26 10:23:25 【问题描述】:

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

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

override func layoutSubviews() 

    timingCollectionHeight.constant = timingCollection.collectionViewLayout.collectionViewContentSize.height

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

【问题讨论】:

【参考方案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;

希望这会有所帮助。 快乐编码:)

【讨论】:

【参考方案2】:

另一种方法: 将 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)
    

【讨论】:

以上是关于UITableViewCell 无法根据它包含的动态 CollectionView 调整高度的主要内容,如果未能解决你的问题,请参考以下文章

UIView 动画在 UITableViewCell 内无法正常工作

使用 UIButton 自定义 UITableViewCell:无法更改 UIImage

无法获取 UITableViewCell 的索引路径

在运行时无法更改和自定义自定义 UITableViewCell 中的 UIButtons 的标题

首次出现时无法在 UITableViewCell 中更改 UILabel 的框架(使用自动布局)

iPad上的UITableViewCell宽度不正确