在 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.height
、cell.subtitleLabel.frame.size.height
和cell.thumbnail.frame.size.height
都返回nil
。我认为这是因为每当调用 sizeForItemAtIndexPath
时,单元格还没有加载,cellForItemAtIndexPath
还没有被调用。
我需要知道这一点,因为cell.titleLabel
可以是在cellForItemAtIndexPath
中设置的多条线和宽度。
有什么想法吗?
【问题讨论】:
也许这可以帮助***.com/questions/30405063/… 您不应该在除cellForItemAt:
之外的函数中将单元格出列即使您确实将单元格出列,您也不会得到一个填充了该索引路径值的单元格。您需要根据单元格的数据计算高度值,或使用自动单元格高度并为您的单元格提供合理的estimatedSize
【参考方案1】:
sizeForItemAt
在您的 cell
实际创建和配置所需数据之前被调用。这就是您没有获得所需正确数据的原因。
试试这个:
在sizeForItemAt
中创建一个dummy cell
,由dequeuing
从collectionView
中创建。使用要显示的实际数据配置单元格。配置后获取您需要的数据,即
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 大小