使用垂直无限滚动显示 UICollectionView 中的需求单元格

Showing cells in demands in UICollectionView with vertical infinite scroll

我想知道如何使用 UICollectionView 实现 按需加载 的预期效果,就像在您进行搜索时在亚马逊应用程序中一样,它 returns 只有一些项目直到滚动结束,然后加载指示器设置为加载更多单元格并继续直到显示搜索中的所有产品。

例如下图:

一般都得在numberOfItemsInSection里设置,数据源的items个数,怎么设置的,你设置item总数然后lazy加载什么的?

提前致谢。

我也在研究 UICollectionView 的无限滚动。这是您需要的功能。

func scrollViewDidScroll(scrollView: UIScrollView) {
    let offsetY = scrollView.contentOffset.y
    let contentHeight = scrollView.contentSize.height
    if offsetY > contentHeight - scrollView.frame.size.height {
        println("this is end, see you in console")
    }
}

并且您可以在 if 子句中编写代码。 reloadData()我觉得。

// load data for collection view
func loadGroundData(){
    AVCloud.callFunctionInBackground("GroundWaterFallList", withParameters: [:]) {
        (result: AnyObject!, error: NSError!) -> Void in
        if error == nil {
            NSLog("ground users count: \(result.count)")
            NSLog("\(result[0])")
            self.ground_water_fall_people = result as NSArray
            self.collectionView?.reloadData()
        }
    }
}

好吧,我还在努力,希望对您有所帮助。并希望有人能解释这两个功能。 collectionView(collectionView: UICollectionView, didEndDisplayingCell cell: UICollectionViewCell, forItemAtIndexPath indexPath: NSIndexPath) scrollViewDidScroll

像上面的 crazy_phage 那样使用 scrollViewDidScroll 函数,您可以观察到何时最终到达 CollectionView 的最后一个,然后您可以更新 numberOfRowInSections 并调用 reloadData通过以下方式:

class CollectionSampleViewController: UICollectionViewController {

    private let reuseIdentifier1 = "Cell"
    private var numberOfItemsPerSection = 9    

    override func viewDidLoad() {
       super.viewDidLoad()        
    }

    override func didReceiveMemoryWarning() {
       super.didReceiveMemoryWarning()
    }

    override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
       return 1
    }

    override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
       return numberOfItemsPerSection
    }    

    override func scrollViewDidScroll(scrollView: UIScrollView) {
       let offsetY = scrollView.contentOffset.y
       let contentHeight = scrollView.contentSize.height

       if offsetY > contentHeight - scrollView.frame.size.height {            
          numberOfItemsPerSection += 6
          self.collectionView.reloadData()
       }
    }   
}

当调用 reloadData 函数时,滚动保持在同一个位置并加载新数据。

在上面的代码中,您可以使用 Activity 指标视图或您想要添加到代码中的任何其他内容。

我们可以使用willDisplay方法:

var endOfData = false

...

func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
    if indexPath.row == model.data.count - 5 && !endOfData {
        loadNextData()
    }
}

看起来是最简单的方法。