UIScrollViewDelegate a deux méthodes de délégués scrollViewDidScroll:
et scrollViewDidEndScrollingAnimation:
mais aucun de ceux - ci vous dire quand le défilement est terminée. scrollViewDidScroll
vous avertit seulement que la vue de défilement n'a pas défilé et non qu'elle a fini de défiler.
L'autre méthode scrollViewDidEndScrollingAnimation
ne semble se déclencher que si vous déplacez la vue de défilement par programme et non si l'utilisateur fait défiler.
Est-ce que quelqu'un connaît un système pour détecter quand une vue de défilement a terminé le défilement?
ios
iphone
uiscrollview
Michael Gaylord
la source
la source
Réponses:
la source
le 320 implémentations sont tellement meilleures - voici un patch pour obtenir un début / une fin cohérents du scroll.
la source
Je pense que scrollViewDidEndDecelerating est celui que vous voulez. Sa méthode facultative UIScrollViewDelegates:
Indique au délégué que la vue de défilement a cessé de ralentir le mouvement de défilement.
Documentation UIScrollViewDelegate
la source
Pour tous les parchemins liés aux interactions de glissement, cela suffira:
Maintenant, si votre défilement est dû à un setContentOffset / scrollRectVisible programmatique (avec
animated
= YES ou vous savez évidemment quand le défilement est terminé):Si votre défilement est dû à autre chose (comme l'ouverture du clavier ou la fermeture du clavier), il semble que vous deviez détecter l'événement avec un hack car ce
scrollViewDidEndScrollingAnimation
n'est pas utile non plus.Le cas d'une vue par défilement PAGINÉE :
Parce que, je suppose, Apple applique une courbe d'accélération,
scrollViewDidEndDecelerating
est appelé pour chaque traînée, il n'est donc pas nécessaire de l'utiliserscrollViewDidEndDragging
dans ce cas.la source
scrollViewDidEndDecelerating
ne sera pas appeléCela a été décrit dans certaines des autres réponses, mais voici (en code) comment combiner
scrollViewDidEndDecelerating
etscrollViewDidEndDragging:willDecelerate
effectuer certaines opérations lorsque le défilement est terminé:la source
Je viens de trouver cette question, qui est à peu près la même que celle que j'ai posée: Comment savoir exactement quand le défilement d'un UIScrollView s'est arrêté?
Bien que didEndDecelerating fonctionne lors du défilement, le panoramique avec relâchement stationnaire n'est pas enregistré.
J'ai finalement trouvé une solution. didEndDragging a un paramètre WillDecelerate, qui est faux dans la situation de libération stationnaire.
En recherchant! Decelerate dans DidEndDragging, combiné avec didEndDecelerating, vous obtenez les deux situations qui sont la fin du défilement.
la source
Si vous êtes dans Rx, vous pouvez étendre UIScrollView comme ceci:
ce qui vous permettra de faire comme ceci:
Cela prendra en compte à la fois la traînée et la décélération.
la source
la source
J'ai essayé la réponse d'Ashley Smart et cela a fonctionné comme un charme. Voici une autre idée, en utilisant uniquement scrollViewDidScroll
Je n'avais que deux pages, donc ça a marché pour moi. Cependant, si vous avez plus d'une page, cela peut être problématique (vous pouvez vérifier si le décalage actuel est un multiple de la largeur, mais vous ne saurez pas si l'utilisateur s'est arrêté à la 2ème page ou est en route vers la 3ème ou plus)
la source
Version rapide de la réponse acceptée:
la source
Si quelqu'un a besoin, voici la réponse Ashley Smart dans Swift
la source
Solution juste développée pour détecter lorsque le défilement est terminé à l'échelle de l'application: https://gist.github.com/k06a/731654e3168277fb1fd0e64abc7d899e
Il est basé sur l'idée de suivre les changements des modes de boucle. Et effectuez des blocs au moins après 0,2 seconde après le défilement.
C'est l'idée de base pour le suivi des changements de modes de runloop iOS10 +:
Et solution pour les cibles de faible déploiement comme iOS2 +:
la source
Pour récapituler (et pour les débutants). Ce n'est pas si douloureux. Ajoutez simplement le protocole, puis ajoutez les fonctions dont vous avez besoin pour la détection.
Dans la vue (classe) qui contient UIScrolView, ajoutez le protocole, puis ajoutez toutes les fonctions d'ici à votre vue (classe).
la source
J'ai eu un cas de tapotement et de glissement d'actions et j'ai découvert que le glissement appelait scrollViewDidEndDecelerating
Et le décalage de modification manuellement avec le code ([_scrollView setContentOffset: contentOffset animated: YES];) appelait scrollViewDidEndScrollingAnimation.
la source
Une alternative serait d'utiliser
scrollViewWillEndDragging:withVelocity:targetContentOffset
qui est appelé chaque fois que l'utilisateur lève le doigt et contient le décalage du contenu cible où le défilement s'arrêtera. L'utilisation de ce décalage de contenuscrollViewDidScroll:
identifie correctement le moment où la vue de défilement a cessé de défiler.la source
UIScrollview a une méthode déléguée
Ajoutez les lignes de code ci-dessous dans la méthode déléguée
la source
Il existe une méthode permettant de
UIScrollViewDelegate
détecter (ou mieux de dire `` prédire '') quand le défilement est vraiment terminé:de
UIScrollViewDelegate
qui peut être utilisé pour détecter (ou mieux dire « prédire ») lors du défilement a vraiment terminé.Dans mon cas, je l'ai utilisé avec le défilement horizontal comme suit (dans Swift 3 ):
la source
Utilisation de la logique Ashley Smart et est en cours de conversion en Swift 4.0 et supérieur.
La logique ci-dessus résout des problèmes tels que lorsque l'utilisateur fait défiler la vue de table. Sans la logique, lorsque vous faites défiler la tableview,
didEnd
sera appelée mais elle n'exécutera rien. L'utilise actuellement en 2020.la source
Sur certaines versions antérieures d'iOS (comme iOS 9, 10),
scrollViewDidEndDecelerating
ne sera pas déclenché si le scrollView est soudainement arrêté en touchant.Mais dans la version actuelle (iOS 13),
scrollViewDidEndDecelerating
sera déclenché à coup sûr (pour autant que je sache).Donc, si votre application ciblait également des versions antérieures, vous pourriez avoir besoin d'une solution de contournement comme celle mentionnée par Ashley Smart, ou vous pouvez la suivante.
Explication
UIScrollView sera arrêté de trois manières:
- défilement rapide et arrêté par lui
- même - défilement rapide et arrêté par le toucher du doigt (comme le frein d'urgence)
- défilement lent et arrêté
Le premier peut être détecté par
scrollViewDidEndDecelerating
et d'autres méthodes similaires tandis que les deux autres ne le peuvent pas.Heureusement,
UIScrollView
a trois statuts que nous pouvons utiliser pour les identifier, qui est utilisé dans les deux lignes commentées par "// 1" et "// 2".la source