Swift中的UICollectionView自定义布局重新加载问题

Rav*_*avi 0 uicollectionviewcell uicollectionviewlayout swift

这是参考链接:

https://www.raywenderlich.com/107439/uicollectionview-custom-layout-tutorial-pinterest

我已UICollectionView在最后一个单元中实现了更多加载,数据正在下载,下载完成后我想重新加载集合

collectionView.collectionViewLayout.invalidateLayout()
self.collectionView.reloadData()

let concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
dispatch_async(concurrentQueue) {
            DataManager.sharedInstance.homeRequest(Dictionary: params, onSuccess: { (dict) in
                self.downloadPageIndex +=  1
                let response = HomeObject(dictionary: dict)

                for (_,e) in (response.dataDict?.enumerate())!{
                    self.dataArray.append(e)
                }

                dispatch_async(dispatch_get_main_queue()) {

                    self.collectionView.reloadData()
                    self.collectionView.collectionViewLayout.invalidateLayout()

                }
                self.activityIndicatorCell.stopAnimating()

                }, onError: { (error) in
                    self.activityIndicatorCell.stopAnimating()

            })
Run Code Online (Sandbox Code Playgroud)

像这个collectionview reloadata

谁能帮我吗?

ami*_*krd 5

经过一番挖掘,我想出了问题,并且遇到了您当前遇到的问题!

问题在PintrestLayout文件内

在里面,您会发现类似(PROBLEM)的代码:

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

基本上,如果要应用于CollectionView的属性为空(它们在开始时),则将PintrestLayout应用于它,那就太完美了!但是如果您要重新加载数据并将其添加到collectionView,则需要再次应用布局,但是当您尝试将布局再次应用于collectionView时,缓存不会为空,因此它会返回并且根本不起作用。 。

解决方案

将该代码替换为:

guard cache.isEmpty == true || cache.isEmpty == false, let collectionView = collectionView else {
        return
    }
Run Code Online (Sandbox Code Playgroud)

现在您说的是“我不在乎它是否为空,只需将该死的布局应用于我的collectionView”

并做了!现在reloadData()将更新您有多少个单元格...

但是,如果您想使其速度更快并修剪一些内存等,这将是非常昂贵的。然后查看invalidateFlowLayout文档。