防止由于重复使用动态collectionView单元而导致sizeForItemAt使用错误的单元格大小

时间:2019-05-29 23:26:46

标签: ios swift autolayout uicollectionviewcell

我使用自动布局来动态计算collectionView单元的大小。某些单元格在第一次滚动以查看端口时,正在使用重用单元格中的尺寸。当我继续滚动collectionView时,它们将被设置为正确的值。

在我的sizeForItemAt中,我有以下内容:

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        if let cachedSize = cachedHeightForIndexPath[indexPath] {
            return cachedSize
        }

        if let cell = collectionView.cellForItem(at: indexPath) {
            cell.setNeedsLayout()
            cell.layoutIfNeeded()
            let size = cell.contentView.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize)
            cachedHeightForIndexPath[indexPath] = size
            print("value is \(size) for indexpath: \(indexPath)")
            return size
        }
        return CGSize(width: ScreenSize.width, height: 0.0)
    }

我进行了三个会话,第一部分的所有单元格的理论高度都等于88,其他所有部分的所有单元格的高度均等于104。

最初,只有第一部分可见。从控制台,我可以看到单元的高度设置为预期的88.0。当我滚动到其余部分时(第一部分将是不可见的,单元格将被重用),第二部分和第三部分中的某些单元格在第一次滚动到查看端口而不是104时将值88.0用作单元格的高度当我继续滚动时,错误尺寸的单元将使用104作为尺寸。我们如何强制所有像元重新计算高度,而不使用旧像元的高度。

1 个答案:

答案 0 :(得分:1)

您的想法是正确的,但是当您通过调用systemLayoutSizeFitting而不是在现有单元格({{1 }}),您需要使用配置为systemLayoutSizeFitting并对其进行测量并测量那个 model 单元来武装自己。

这就是我的操作方法(与您的方法非常相似,只是有一个区别;另外,我将尺寸存储在模型中):

collectionView.cellForItem