Trouver le sens de défilement dans une UIScrollView?
J'ai un UIScrollView
avec seulement le défilement horizontal permis, et je voudrais savoir quelle direction (gauche, droite) l'utilisateur fait défiler. Ce que j'ai fait était à la sous-classe le UIScrollView
et remplacer le touchesMoved
méthode:
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesMoved:touches withEvent:event];
UITouch *touch = [touches anyObject];
float now = [touch locationInView:self].x;
float before = [touch previousLocationInView:self].x;
NSLog(@"%f %f", before, now);
if (now > before){
right = NO;
NSLog(@"LEFT");
}
else{
right = YES;
NSLog(@"RIGHT");
}
}
Mais cette méthode n'est pas appelée à tous quand je bouge. Qu'en pensez-vous?
- Voir ma réponse ci-dessous -- vous devriez être en utilisant le défilement de l'affichage des délégués pour ce faire.
- meilleure réponse ici: stackoverflow.com/questions/11262583/...
Vous devez vous connecter pour publier un commentaire.
La détermination de la direction est assez simple, mais gardez à l'esprit que le sens peut changer plusieurs fois au cours d'un geste. Par exemple, si vous avez un défilement de l'affichage avec la pagination activé et l'utilisateur glisse le doigt pour aller à la page suivante, la direction initiale pourrait être à droite, mais si vous avez rebondir allumé, il sera brièvement aller dans aucun sens du tout, et ensuite brièvement aller vers la gauche.
Pour déterminer la direction, vous aurez besoin d'utiliser la
UIScrollView scrollViewDidScroll
délégué. Dans cet exemple, j'ai créé une variable nomméelastContentOffset
que j'utilise pour comparer le contenu actuel de décalage avec la précédente. Si il est plus grand, alors la scrollView est de défilement à droite. Si c'est moins la scrollView est de défilement à gauche:Je suis à l'aide de l'enum ci-dessous pour définir la direction. Le réglage de la première valeur à ScrollDirectionNone a l'avantage de faire en sorte que l'orientation par défaut lors de l'initialisation des variables:
lastContentOffset = scrollView.contentOffset.x;
lastContentOffset
type. Concernant les biens vs variables statiques: soit solution est un bon choix. Je n'ai pas de réelle préférence. C'est un bon point.- (void)scrollViewDidScroll:(UIScrollView *)sender
devrait être- (void)scrollViewDidScroll:(UIScrollView *)scrollView
(scrollView)scrollView.contentOffset.y < 0
pour ne recevoir que les "vrai" sens.jusqu'.Dans ce cas, sur iOS 5 et au-dessus, utilisez le
UIScrollViewDelegate
afin de déterminer l'orientation de l'utilisateur du poêle geste:À l'aide de
scrollViewDidScroll:
est un bon moyen de trouver le sens du courant.Si vous voulez savoir la direction après l'utilisateur a fini de défilement, utilisez la commande suivante:
Pas nécessaire d'ajouter une variable supplémentaire pour garder une trace de ce. Utilisez simplement le
UIScrollView
'spanGestureRecognizer
propriété comme cela. Malheureusement, cela ne fonctionne que si la vitesse n'est pas 0:Vous pouvez utiliser une combinaison de composants x et y pour détecter haut, bas, gauche et droite.
La solution
velocityInView
au lieu detranslationInView
. Cela résout le problème qui se pose lors du changement de direction dans le même mouvement.Swift 4:
Pour le défilement horizontal, vous pouvez tout simplement faire :
Pour le défilement vertical changement
.x
avec.y
Dans iOS8 Swift j'ai utilisé cette méthode:
J'ai un point de vue dynamique qui change des endroits que l'utilisateur fait défiler alors que la vue peut sembler comme il est resté à la même place sur l'écran. Je suis également suivi lorsque l'utilisateur est à la hausse ou à la baisse.
Ici est aussi une façon alternative:
crollViewDidEndDecelerating
droit ?C'est ce qu'il a travaillé pour moi (Objective-C):
Alternativement, il est possible d'observer le chemin clé "contentOffset". Ceci est utile lorsqu'il n'est pas possible pour vous de régler/modifier le délégué de défilement de la vue.
Après l'ajout de l'observateur, vous pouvez maintenant:
Ne pas oublier de supprimer l'observateur en cas de besoin. par exemple, vous pouvez ajouter de l'observateur dans viewWillAppear et de le retirer en viewWillDisappear
Dans swift:
Vous pouvez le faire aussi dans scrollViewDidScroll.
Voici ma solution pour le comportement comme dans @followben réponse, mais sans perte de démarrage lent (quand dy 0)
J'ai vérifié certains de la réponse et des précisions sur AnswerBot réponse en enveloppant le tout dans une goutte dans UIScrollView catégorie. Le "lastContentOffset" est enregistré à l'intérieur de la uiscrollview à la place, et puis c'est juste une question de faire appel :
Code Source à la
https://github.com/tehjord/UIScrollViewScrollingDirection
Je préfère faire un filtrage basé sur @memmons la réponse de
En Objective-C:
Lorsqu'il est testé dans
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
:self.lastContentOffset
change très vite, l'écart de valeur est proche de 0,5 f.Il n'est pas nécessaire.
Et, occasionnellement, lors de la manipulation exacte de condition, votre orientation peut-être de se perdre. (mise en œuvre des déclarations sauté parfois)
tels que :
Dans Swift 4:
Lors de la pagination est activée,vous pouvez utiliser ces codes.
Codes explique lui-même, je suppose.
CGFloat difference1 et difference2 déclaré dans la même classe interface privée.
Bon si contentSize reste la même.
Ok donc pour moi cette mise en œuvre est très bon:
Ce sera le feu textView à rejeter après le glissement se termine
Utiliser cette méthode du délégué de la scrollview.
Si la coordonnée de la vitesse est +ve défilement de l'affichage fait défiler vers le bas et s'il l'est, la ve le scrollview défile vers le haut.
De la même manière à gauche et à droite de défilement peuvent être détectés à l'aide de x coordonner.
Court & Facile serait, il suffit de vérifier la valeur de la vitesse, si son supérieur à zéro, alors le défilement gauche d'autre droit:
Si vous travaillez avec UIScrollView et UIPageControl, cette méthode sera également modifier le contrôle pagecontrol de l'affichage de la page.
Merci @Esq 's code Swift.
Swift 2.2 solution Simple qui suit unique et de multiples directions sans aucune perte.
Dans tous les supérieure répond à deux grandes façons de résoudre ce problème est l'utilisation de
panGestureRecognizer
oucontentOffset
. Les deux méthodes ont leurs inconvénients et les avantages.Méthode 1: panGestureRecognizer
Lorsque vous utilisez
panGestureRecognizer
comme quoi @followben suggéré, si vous ne voulez pas de programmation pour faites défiler la vue, il fonctionne correctement.Contre
Mais si vous vous déplacez de défilement de l'affichage avec code suivant, code supérieur ne peut pas le reconnaître:
Méthode 2: contentOffset
Contre
Si vous voulez changer contentOffset par programme, au cours de défilement (comme quand vous voulez créer une infinité de défilement), cette méthode permet de problème, car vous risquez de vous changer
contentOffset
au cours de l'évolution des contenus des vues sur les places et dans ce temps, le code supérieur de sauter dans que vous faites défiler vers la droite ou la gauche.