Swift 4 UICollectionView détecte la fin du défilement
J'ai une Horizontal
UICollectionView
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])
}
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
}
}
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
}
}
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
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)
} }