使用 Pinterest 单元格在 swift 中添加或删除单元格后使用自定义布局调整 UICollectionView 的大小

Resizing UICollectionView with Custom Layout after adding or deleting cells in swift using Pinterest cell

我从以下位置为我的 CollectionView 下载了遵循 Pintrest 自定义布局: https://www.raywenderlich.com/4829472-uicollectionview-custom-layout-tutorial-pinterest

所以布局工作正常,我设置好了,所以当你滚动到底部时,我需要让它实现像分页功能。

问题: 如果用户在数组中添加或删除数据,则单元格不会反映其布局。例如:如果我第一次在数组中有 35 个对象并且我删除了 5 条记录,那么当它显示到 35 个对象时,可滚动应该固定为 32 个对象,但在删除的情况下记录正确显示。但是如果我们在运行时添加接下来的 35 个对象,那么我的数组有 70 条记录,但是集合视图没有重新加载数据它仍然显示 35 条记录。

在删除的情况下如何删除这个space白色space? 以及如何重新加载它并在添加时显示更多单元格?

请帮忙。

我终于找到了答案。

只需注释下面在 prepare 函数中编写的代码

guard cache.isEmpty == true, let collectionView = collectionView
else {
        return
    }

并且在注释完上面的代码之后,编写下面给出的代码:

cache.removeAll()
guard cache.isEmpty == true || cache.isEmpty == false, let collectionView = collectionView else {
            return
        }
    contentHeight = 0

在同一个函数中。现在终于可以用了。

在上面的例子中 cache.isEmpty == true || cache.isEmpty == false,您实际上并没有检查缓存元素的任何内容。代码与guard let collectionView = collectionView else {return}

相同

这不是准备布局的正确方法。如果将新项目添加到缓存中,则不应重新计算现有元素。这不仅是不必要的操作,而且用户体验也很差。当用户向下滚动时,现有项目的单元格将立即更改。

要正确处理追加新元素,您可以这样做; guard cache.isEmpty || collectionViewItemCount > cache.count, let collectionView = collectionView else { return }

override func prepare() {
    let collectionViewItemCount = delegate?.numberOfItemsInCollectionView() ?? 0
    guard cache.isEmpty || collectionViewItemCount > cache.count, let collectionView = collectionView else { return }
    
    .
    .
    .
    
    // set the last cached item's height to the yOffSet 
    for index in 0..<yOffset.count {
        yOffset[index % numberOfColumns] = cache.last(where: {[=10=].indexPath.row % numberOfColumns == index % numberOfColumns})?.frame.maxY ?? 0
    }
    
    for item in 0..<collectionView.numberOfItems(inSection: 0) {
        let indexPath = IndexPath(item: item, section: 0)
        if indexPath.row >= cache.count {
    .
    .
    .
     cache.append(attributes)
    .
    .
    .        
        }
    }
}

p.s.: 你还需要添加 func numberOfItemsInCollectionView() -> Int 到 PinterestLayoutDelegate