在 reloadData 中错误地调整了集合单元格的大小

Collection cell wrongly resized in reloadData

我不知道为什么,但我的 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 之后错误地调整了宽度?

我在扩展 UICollectionViewDelegateFlowLayout 时遇到了类似的问题,结果是在故事板(大小检查器)中将 collectionView 的估计大小设置为 "None" 解决了这个问题。

如 Xcode 11 发行说明中所述:

Cells in a UICollectionView can now self size with Auto Layout constrained views in the canvas. To opt into the behavior for existing collection views, enable “Automatic” for the collection view’s estimated size, and “Automatic” for cell’s size from the Size inspector. If deploying before iOS 13, you can activate self sizing collection view cells by calling performBatchUpdates(_:completion:) during viewDidLoad(). (45617083)

因此,新创建的 collectionViews 将属性 "Estimated Size" 设置为 "Automatic" 并且单元格的大小是根据其子视图尺寸计算的,因此忽略了 UICollectionViewDelegateFlowLayout 扩展方法,即使它们被调用。