82 votes

Détection du changement de page UIScrollView

Existe-t-il un moyen de détecter ou d’obtenir une notification lorsque l’utilisateur modifie la page dans un UIScrollView activé pour la pagination?

194voto

Michael Waterfall Points 10490

Utilisez cette option pour détecter la page actuellement affichée et effectuer certaines actions lors du changement de page:

 - (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    static NSInteger previousPage = 0;
    CGFloat pageWidth = scrollView.frame.size.width;
    float fractionalPage = scrollView.contentOffset.x / pageWidth;
    NSInteger page = lround(fractionalPage);
    if (previousPage != page) {
        // Page has changed, do your thing!
        // ...
        // Finally, update previous page
        previousPage = page;
    }
}
 

S'il est acceptable que vous réagissiez au changement de page une fois le défilement complètement arrêté, il serait alors préférable de procéder comme indiqué ci-dessus dans la méthode de délégation scrollViewDidEndDecelerating: au lieu de la méthode scrollViewDidScroll: .

66voto

Ankur Badola Points 471

Dans la pagination permis de défilement de l'affichage vous pouvez utiliser scrollViewDidEndDecelerating de savoir quand la vue est réglé sur une page (peut-être la même page).

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView

scrollViewDidScroll est appelée à chaque mouvement. Et dans le contexte de la pagination permis de vue peut être utilisée pour trouver quand il défile assez pour passer à la page suivante (si glisser est arrêté à ce stade).

25voto

Segev Points 6481

Premier résultat sur google pour la détection de page, donc j'ai eu à répondre à cette avec une meilleure solution, à mon avis. (même si cette question a été posée de 2 ans et demi.)

Je préfère ne pas appeler scrollViewDidScroll juste pour suivre le numéro de page. C'est inutile pour quelque chose de simple comme ça. À l'aide de scrollViewDidEndDecelerating fonctionne et s'arrête sur un changement de page , MAIS (et c'est un gros mais) si l'utilisateur va glisser sur l'écran deux fois un peu plus vite que la normale scrollViewDidEndDecelerating sera appelée qu'une seule fois. Vous pouvez facilement passer de la page 1 à la page 3, sans la page de traitement #2.

Cela a résolu complètement pour moi:

- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView
{
    scrollView.userInteractionEnabled = NO;
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    //Run your code on the current page
    scrollView.userInteractionEnabled = YES;
}

De cette façon, l'utilisateur ne peut glisser une page à la fois, sans les risques décrits ci-dessus.

17voto

Viraj Points 1311

Implémentez le délégué de UIScrollView. Cette méthode est ce que vous recherchez.

 - (void)scrollViewDidScroll:(UIScrollView *)scrollView
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X