web-dev-qa-db-ja.com

Swift 4 UICollectionViewはスクロールの終了を検出します

アプリにHorizontalUICollectionViewがあり、ユーザーが左にドラッグしているときにUICollectionViewの最後(またはほぼ最後)に到達したときに、さらにデータをロードします。

私はSwift 4.を使用しています。いくつかのSwift 3つのソリューションが見つかりましたが、それらは私には機能しません。

私の現在のコードは:

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return self.videoViewModel.images.count
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionViewCell", for: indexPath) as! CollectionViewCell
    cell.imgImage.image = self.videoViewModel.images[indexPath.row]

    return cell
}

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    updateVideo(data: self.videoViewModel.relatedVideos[indexPath.row])
}
7
Rexhin Hoxha

コレクションビューのcellForItemまたはwillDisplayItemメソッドを使用できます。最後のセルが表示されているかどうかを確認し、データをロードします。例えば:

迅速:

func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
     if (indexPath.row == dataSource.count - 1 ) { //it's your last cell
       //Load more data & reload your collection view
     }
}

Objective-C:

- (void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.row == dataSource.count - 1 ) { //it's your last cell
       //Load more data & reload your collection view

    }
}
8
Fayza Nawaz

scrollViewDidScrollのメソッドUIScrollViewDelegateを実装します。

var isLoading: Bool = false

 func scrollViewDidScroll(_ scrollView: UIScrollView) {
    let contentOffsetX = scrollView.contentOffset.x
    if contentOffsetX >= (scrollView.contentSize.width - scrollView.bounds.width) - 20 /* Needed offset */ {
        guard !self.isLoading else { return }
        self.isLoading = true
        // load more data
        // than set self.isLoading to false when new data is loaded
    }
}
4
Ilya Kharabet

次のように、ページ番号に1つのブール変数と1つの整数変数を使用します。

var isDataLoading = false
var pageCount:Int = 1 // Pass this page number in your api

cellForItemAtメソッドに以下のコードを追加します。

if !isDataLoading && indexPath.row == videoViewModel.count - 1 {
            isDataLoading = true
            pageCount += 1
// add you api call code here with pageCount
        }

aPIからデータを取得したら、以下のようにisDataLoading boolをfalseに設定します。

self.isDataLoading = false
1
iVarun

これは最後のインデックスに移動する単純なログインです... !!!

func ScrollEnd() {
          let lastSectionIndex = (self.collectionView?.numberOfSections)! - 1
         let lastItemIndex = (self.collectionView.numberOfItems(inSection: lastSectionIndex)) - 1
           let index =  IndexPath(item: lastItemIndex, section: lastSectionIndex)
           if messages.count != 0{
               self.collectionView!.scrollToItem(at: index, at: UICollectionView.ScrollPosition.bottom, animated: false)
           }    }
1
Zain Shahzad

これをcollectionViewに追加しますwillDisplayCellデリゲート

if (indexPath.row == dataSource.count - 1 ) {
 //it's your last cell

//Load more data & reload your collection view
  }
0