UIPanGestureRecognizer Seule la verticale ou à l'horizontale
J'ai une vue qui a un UIPanGestureRecognizer
pour faire glisser verticalement la vue. Ainsi, dans le module de reconnaissance de rappel, je n'mise à jour de la coordonnée de la déplacer. Le superview de ce point de vue, a une UIPanGestureRecognizer
qui va faire glisser la vue à l'horizontale, juste la mise à jour de l'abscisse.
Le problème est que la première UIPanGestureRecognizer
est de prendre le cas pour déplacer la vue à la verticale, donc je ne peux pas utiliser le superview geste.
J'ai essayé
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldRecognizeSimultaneouslyWithGestureRecognizer:
(UIGestureRecognizer *)otherGestureRecognizer;
et les deux fonctionnent, mais je n'en veux pas. Je veux le à l'horizontale pour être détectée que si le mouvement est clairement à l'horizontale. Donc, ce serait formidable si la UIPanGestureRecognizer
avait un sens de la propriété.
Comment puis-je obtenir ce comportement? - Je trouver les docs très confus, peut-être que quelqu'un peut expliquer mieux ici.
- Il est normal de répondre à votre propre question et accepter la réponse, si vous avez trouvé la solution.
- vraiment? Donc, peut-être que vous faites de la catégorie de geste de balayage pour recevoir la traduction et de la vitesse du geste?
- Je ne comprends pas ce que vous dites. Si vous voulez détecter un glissement horizontal, c'est totalement et complètement intégré dans le système d'exploitation. Tout le travail est entièrement et totalement fait pour vous. Vous avez besoin de faire ... rien! 🙂 Il suffit de coller les deux lignes de code dans cet exemple .. stackoverflow.com/a/20988648/294884 Notez que vous pouvez choisir à gauche seulement" de "droite" ou "les deux".
Vous devez vous connecter pour publier un commentaire.
Viens de le faire pour le panoramique vertical geste de reconnaissance, ça fonctionne pour moi:
velocityInView
au lieu detranslationInView
.J'ai créé une solution de sous-classement comme en réponse @LocoMike fourni, mais il a utilisé la plus efficace le mécanisme de détection de la via de la vitesse initiale fournie par @Hejazi. Je suis également l'utilisation de Swift, mais ce devrait être facile à traduire à l'Obj-C si vous le souhaitez.
Avantages par rapport à d'autres solutions:
Voici le code:
Exemple d'utilisation:
UIPanGestureRecognizer
.let horizontalPanRecognizer = PanDirectionGestureRecognizer(direction: .horizontal, target: self, action: #selector(handleHorizontalPanGesture(recognizer:))) self.view?.addGestureRecognizer(horizontalPanRecognizer); let verticalPanRecognizer = PanDirectionGestureRecognizer(direction: .vertical, target: self, action: #selector(handleVerticalPanGesture(recognizer:))) self.view?.addGestureRecognizer(verticalPanRecognizer);
J'ai pensé à elle la création d'une sous-classe de UIPanGestureRecognizer
DirectionPanGestureRecognizer:
DirectionPanGestureRecognizer.m:
Cela ne fera que déclencher le geste si l'utilisateur commence à faire glisser dans le comportement sélectionné. Définir la direction de la propriété à une valeur correcte et vous êtes tous ensemble.
initWithTarget:action:
méthode et appelé reset et tout allait bien.DirectionPanGestureRecognizer
ne tiendra pas compte de rapide traîne, sauf si vous définissezkDirectionPanThreshold = 20
ou alors, dans ce cas, il peut donner de fausses alarmes. Je suggère de mettreabs(_moveX) > abs(_moveY)
au lieu deabs(_moveX) > kDirectionPanThreshold
et l'évolution horizontale cas respectivement._drag = YES
j'ai ajoutéself.state = UIGestureRecognizerStateChanged;
J'ai essayé de limiter la validité de la région à l'horizontale avec UIPanGestureRecognizer.
Alors, seulement, effectuez un balayage à l'intérieur de thresholdAngle degrés à l'horizontale peut déclencher ce pan geste.
Swift 3.0 réponse: simplement gère la verticale geste
La solution suivante a résolu mon problème:
C'est en fait juste vérifier si la poêle est d'aller sur la vue principale ou tableView.
Swift 3 version de Lee réponse pour les paresseux
Vous pouvez trouver la direction de glisser sur
UIView
parUIPanGestureRecognizer
. Veuillez suivre le code.J'ai pris Lee Goodrich's réponse et étendu comme j'ai besoin spécifiquement d'une seule direction de pan. L'utiliser comme ceci:
let pan = PanDirectionGestureRecognizer(direction: .vertical(.up), target: self, action: #selector(handleCellPan(_:)))
J'ai aussi ajouté quelques commentaires pour le rendre un peu plus claire de ce que les décisions soient effectivement réalisés.
override func touchesMoved
-Method does not override any method from its superclass
.Voici comment je l'ai résolu:
D'abord, j'ai activé Simultanément PanGesture Reconnaissance.
Puis-je Isoler Horizontale et Verticale Pan gestes (accumulateur est NSMutableArray la propriété):
J'ai poussé un exemple ici:
ajouter des pan dans le scrollview
Vous pouvez utiliser de simples
panGestureRecognizer
. Pas besoin d'utiliserpandirectionregognizer
ou des trucs. Utilisez juste valeur y detranslationInview
Ci-dessous le code de glisser-déplacer uniquement dans la vue en haut et en bas
J'ai créé PanGestureRecognizer @sélecteur de la méthode d'action pour l'objet que de besoin seulement de défilement Horizontal.
Moyen rapide de
Swift 4.2
La solution est juste que pour le soutien pan geste à la verticale, même à l'horizontale.
Solution 1:
Solution 2:
Puis le geste de balayage va avaler le pan geste. Bien sûr, vous n'avez pas besoin de faire quoi que ce soit dans
swipeAction
.Pour tous les clients de Swift là-bas, ce sera de faire le travail 🙂
J'ai pris un excellent réponse par Lee Goodrich et porté à Swift 3
J'aimerais partager mon approche, car toutes les autres approches sont fondées sur des
UIGestureRecognizerDelegate
ou sous-classementUIPanGestureRecognizer
.Mon approche est basée sur l'exécution et swizzling. Je ne suis pas sûr à 100% sur cette approche, mais vous pouvez le tester et l'améliorer vous-même.
Définir le sens de tout
UIPanGestureRecognizer
avec juste une ligne de code:utilisation
pod 'UIPanGestureRecognizerDirection'
ou le code:J'ai essayé ceci: ce qui a fonctionné pour moi comme pour la question décrit
SWIFT 4.2
Je suis allé plus loin et de faire une direction de Pan Geste:
(Utilisé: https://github.com/fastred/SloppySwiper et https://stackoverflow.com/a/30607392/5790492)
PanGestureRecognizer
interface contient les définitions suivantes:Je n'ai pas vérifier, mais c'est peut-être accessible via la sous-classe.