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?
Réponses
Trop de publicités?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:
.
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).
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.