swift 在reloadData中错误调整了收集单元格的大小

ergxz8rk  于 2023-03-07  发布在  Swift
关注(0)|答案(2)|浏览(120)

我不知道为什么,但我的collectionView的单元格在reloadData后自动错误地调整了大小。
在第一次初始化之后,然后在重新加载数据之后:
第一节第一节第一节第一节第一次
我使用UICollectionViewDelegateFlowLayout来定义单元格的大小,但它没有处理这个问题:

func collectionView(_ collectionView: UICollectionView,
                      layout collectionViewLayout: UICollectionViewLayout,
                      sizeForItemAt indexPath: IndexPath) -> CGSize {
    let paddingSpace = sectionInsets.left * (2 + 1)
    let availableWidth = view.frame.width - paddingSpace
    let widthPerItem = availableWidth / 2

    return CGSize(width: widthPerItem, height: widthPerItem)
  }

  func collectionView(_ collectionView: UICollectionView,
                      layout collectionViewLayout: UICollectionViewLayout,
                      insetForSectionAt section: Int) -> UIEdgeInsets {
    return sectionInsets
  }

  func collectionView(_ collectionView: UICollectionView,
                      layout collectionViewLayout: UICollectionViewLayout,
                      minimumLineSpacingForSectionAt section: Int) -> CGFloat {
    return sectionInsets.left
  }

当在cellForItemAt中执行时,单元格具有正确的大小,阴影在此函数中创建,并且具有正确的宽度。
最后一件事是,只有宽度是调整大小,高度保持我想要的。
有人知道为什么在reloadData之后宽度会错误地调整大小吗?

qhhrdooz

qhhrdooz1#

我在扩展UICollectionViewDelegateFlowLayout时遇到了类似的问题,结果是在故事板(大小检查器)中将collectionView的估计大小设置为“无”解决了这个问题。
如Xcode 11发行说明中所述:
UICollectionView中的单元格现在可以使用画布中的自动布局约束视图自行调整大小。若要选择现有集合视图的行为,请从“大小”检查器中为集合视图的估计大小启用“自动”,为单元格大小启用“自动”。如果在iOS 13之前部署,则可以通过在viewDidLoad()期间调用performBatchUpdates(_:completion:)来激活自行调整大小的集合视图单元格。(45617083)
因此,新创建的collectionViews将属性“Estimated Size”设置为“Automatic”,并且计算单元格的大小时考虑其子视图维度,从而忽略UICollectionViewDelegateFlowLayout扩展方法,即使调用了这些方法。

dphi5xsq

dphi5xsq2#

在我的例子中,这种行为的原因是在我的自定义UICollectionViewCell单元格中缺少对super.prepareForReuse in overrided方法的调用。
所以我简单地加了一下,问题就解决了。:]

override func prepareForReuse() {
    super.prepareForReuse() // <-- that was the clue!

    // your code here
}

相关问题