22 votes

Détecter la direction du défilement de UIScrollView dans scrollViewWillBeginDragging

J'ai assez cherché sur Google, et j'ai vérifié des posts comme ceux-ci ( Trouver la direction du défilement dans une UIScrollView? ) sur stackoverflow avant de poster ceci. J'ai un nombre dynamique de photos dans une application iPhone, que j'affiche à travers UIScrollView. À tout moment, seules 3 photos sont affichées dans la vue défilante. Lorsque j'ai, disons, 4 photos, en tout : 1ère photo : affichée à la position 0.0 2ème photo : affichée à la position 320.0 3ème photo : affichée à la position 640.0

Maintenant, lorsque l'utilisateur fait défiler jusqu'à la 4ème photo, la vue défilante se réinitialise à la position 0.0. Si l'utilisateur essaie de faire défiler 'au-delà' de la 4ème photo, le défilement devrait s'arrêter dans la seule direction vers la droite (afin que l'utilisateur ne puisse pas dépasser). Mais actuellement, l'utilisateur 'peut' faire défiler au-delà de la dernière photo ; cependant, je détecte cela de manière programmatique & réinitialise la position. Mais cela ne semble pas propre, car l'utilisateur voit brièvement l'arrière-plan noir. Je veux détecter que l'utilisateur a commencé à faire défiler vers la 'droite' (rappelez-vous, faire défiler vers la 'gauche' c'est-à-dire vers la 'photo précédente' est autorisé) dans scrollViewWillBeginDragging, afin que je puisse arrêter tout autre défilement vers la droite.

Ce que j'ai essayé:

  1. Essayer d'utiliser self.scrollView.panGestureRecognizer's translationInView ne fonctionne pas, car il n'y a pas de instance de panGestureRecognizer retournée en premier lieu (!), bien que l'API UIScrollView le prétende.
  2. Détecter cela dans scrollViewDidEndDecelerating est possible, bien que cela ne servira pas mon objectif.

28voto

mwielbut Points 624

Je n'ai eu aucun problème pour déterminer la direction dans scrollViewWillBeginDragging en vérifiant le panGestureRecognizer de la scroll view :

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{ 
    CGPoint translation = [scrollView.panGestureRecognizer translationInView:scrollView.superview];

    if(translation.y > 0)
    {
        // réagir au glissement vers le bas
    } else
    {
        // réagir au glissement vers le haut
    }
}

J'ai trouvé cela très utile pour annuler une scroll dès le tout premier mouvement de glissement lorsque l'utilisateur glisse dans une direction interdite.

15voto

Oscar Points 1078

Solution Swift 3

1- Ajouter UIScrollViewDelegate

2- Ajouter ce code

func scrollViewWillBeginDecelerating(_ scrollView: UIScrollView) {
    let actualPosition = scrollView.panGestureRecognizer.translation(in: scrollView.superview)
    if (actualPosition.y > 0){
        // Déplacement vers le bas
    }else{
        // Déplacement vers le haut
    }
}

12voto

PAC Points 920

Pour swift 2.0+ & ios 8.0+

func scrollViewWillBeginDecelerating(scrollView: UIScrollView) {
    let actualPosition = scrollView.panGestureRecognizer.translationInView(scrollView.superview)
    if (actualPosition.y > 0){
        // Faire glisser vers le bas 
    }else{
        // Faire glisser vers le haut
    }
}

6voto

Jean Points 704

Merci, Kris. C'est ce qui a finalement fonctionné pour moi :

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    // Détecter la direction du défilement
    if (lastContentOffset < (int)scrollView.contentOffset.x) {
    ...
    }
}

5voto

Michael Thiel Points 1279

C'est ce que j'ai utilisé et ça fonctionne bien du moins sur iOS 6.0 :

- (void)scrollViewDidScroll:(UIScrollView*)scrollView
{
   CGPoint translation = [scrollView.panGestureRecognizer translationInView:scrollView];

   // Détecter la direction en accédant à x ou y de la traduction
}

Vous évite la variable d'instance pour lastContentOffset ...

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