web-dev-qa-db-fra.com

Swift 4 UICollectionView détecte la fin du défilement

J'ai une HorizontalUICollectionView sur mon application et je souhaite charger davantage de données lorsque l'utilisateur atteint la fin (ou presque) de UICollectionView tout en faisant glisser le curseur vers la gauche.

J'utilise Swift 4. J'ai trouvé des solutions Swift 3 mais elles ne fonctionnent pas pour moi.

Mon code actuel est:

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])
}
5
Rexhin Hoxha

Vous pouvez utiliser les méthodes cellForItem ou willDisplayItem de la vue collection. Vérifiez si la dernière cellule est affichée et chargez vos données. Par exemple:

- (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

    }
}
6
Fayza Nawaz

Implémentez la méthode scrollViewDidScroll of 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

Prenez une variable bool et une variable entière pour le numéro de page comme ceci:

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

dans la méthode cellForItemAt, ajoutez le code ci-dessous:

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

une fois que vous obtenez vos données de api, définissez isDataLoading bool sur false comme ci-dessous:

self.isDataLoading = false
1
iVarun

Ceci est simple login qui va descendre au dernier index ... !!!  

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