web-dev-qa-db-fra.com

Détecter le changement de page dans UICollectionView

J'ai essayé de trouver cette question pendant un certain temps, mais je n'ai pas trouvé la réponse à ce problème. Mon problème est que j'ai un UICollectionView et que la direction de défilement est Horizontal avec Paging Enabled. Mon problème est que je veux conserver le tack du numéro de page actuel sur lequel se trouve l'utilisateur, j'ai donc créé une variable int et je veux maintenant l'ajouter ou la soustraire de 1 chaque fois que l'utilisateur glisse vers la droite ou la gauche . J'ai essayé d'utiliser le délégué de scrollView

- (void)scrollViewDidScroll:(UIScrollView *)scrollView

mais lorsque l'utilisateur glisse vers la droite ou vers la gauche, il est appelé autant de fois que le nombre de colonnes sur une page dans le UICollectionView plus il ne me fera pas savoir que si l'utilisateur est allé à la page suivante ou le précédent.

24
Ahsan Ebrahim

Utilisation :

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    CGFloat pageWidth = collectionView.frame.size.width;
    float currentPage = collectionView.contentOffset.x / pageWidth;

    if (0.0f != fmodf(currentPage, 1.0f))
    {
        pageControl.currentPage = currentPage + 1;
    }
    else
    {
        pageControl.currentPage = currentPage;
    }

    NSLog(@"Page Number : %ld", (long)pageControl.currentPage);
}

Et si vous n'utilisez aucun pageControl, alors ceil(currentPage) sera votre numéro de page actuel.

39
itsji10dra

Swift 3 Xcode 8.2

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        let x = scrollView.contentOffset.x
        let w = scrollView.bounds.size.width
        let currentPage = Int(ceil(x/w))
        // Do whatever with currentPage.
}
30
Ahmed Safadi

Sur la base de la réponse de @Shankar BS, je l'ai implémenté comme ceci dans Swit. Gardez à l'esprit que CollectionViewDelegate est conforme à ScrollViewDelegate:

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
    let pageWidth = scrollView.frame.size.width
    let page = Int(floor((scrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1)
    print("page = \(page)")
}
9
Andrej

Vous pouvez obtenir la page actuelle comme ci-dessous, l'index sera de 0 à (total page - 1)

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
 {
    CGFloat pageWidth = scrollView.frame.size.width;
    int page = floor((scrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1;
    NSLog(@"Current page -> %d",page);
}
8
Shankar BS

Swift 2.2

 func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
    let x = collectionView.contentOffset.x
    let w = collectionView.bounds.size.width
    let currentPage = Int(ceil(x/w))
    print("Current Page: \(currentPage)")
}
3
Jonni Åkesson