在 sizeForItemAtIndexPath 中调用 UICollectionView 单元

Posted

技术标签:

【中文标题】在 sizeForItemAtIndexPath 中调用 UICollectionView 单元【英文标题】:Call a UICollectionView Cell in sizeForItemAtIndexPath 【发布时间】:2017-08-24 12:22:45 【问题描述】:

我希望能够在sizeForItemAtIndexPath 函数中调用我的UICollectionViewCell 类。像这样:

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

    let cell = MyCollectionViewCell()

    let itemHeights = cell.titleLabel.frame.size.height + cell.subtitleLabel.frame.size.height + 20 

    return CGSize(width: self.view.frame.size.width - 30, height: itemHeights + cell.thumbnail.frame.size.height)


问题是cell.titleLabel.frame.size.heightcell.subtitleLabel.frame.size.heightcell.thumbnail.frame.size.height 都返回nil。我认为这是因为每当调用 sizeForItemAtIndexPath 时,单元格还没有加载,cellForItemAtIndexPath 还没有被调用。

我需要知道这一点,因为cell.titleLabel 可以是在cellForItemAtIndexPath 中设置的多条线和宽度。

有什么想法吗?

【问题讨论】:

也许这可以帮助***.com/questions/30405063/… 您不应该在除cellForItemAt: 之外的函数中将单元格出列即使您确实将单元格出列,您也不会得到一个填充了该索引路径值的单元格。您需要根据单元格的数据计算高度值,或使用自动单元格高度并为您的单元格提供合理的estimatedSize 【参考方案1】:

sizeForItemAt 在您的 cell 实际创建和配置所需数据之前被调用。这就是您没有获得所需正确数据的原因。

试试这个:

sizeForItemAt 中创建一个dummy cell,由dequeuingcollectionView 中创建。使用要显示的实际数据配置单元格。配置后获取您需要的数据,即

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

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)
    //Configure your cell with actual data
    cell.contentView.layoutIfNeeded()
    //Calculate the size and return

【讨论】:

警告:dequeueReusableCell 在 sizeForItemAt 中通过数十次模拟器运行(包括 iPhone 和 iPad,以及许多 iPhone 设备运行)为我可靠地工作,然后在 iPad Air 上运行时使应用程序崩溃。我现在使用此处描述的 sizingCell 方法获得了更好的结果:***.com/a/53786943/1473527

以上是关于在 sizeForItemAtIndexPath 中调用 UICollectionView 单元的主要内容,如果未能解决你的问题,请参考以下文章

在不使用单元格的情况下计算 UICollectionView 中的 sizeForItemAtIndexPath

F# Xamarin 中的 SizeforItematIndexPath

iOS collectionView.sizeForItemAtIndexPath 在 iPhone 6 之前的任何东西上都会中断

在不同设备方向上更改 UICollectionViewCell 大小

如何手动使用 FlowLayout 中的estimateSize

UICollectionViewCell 不强制单元格大小