J'ai une vue qui permet de UIPanGestureRecognizer
faire glisser la vue verticalement. Donc, dans le rappel de reconnaissance, je ne mets à jour que la coordonnée y pour la déplacer. Le superview de cette vue a un UIPanGestureRecognizer
qui fera glisser la vue horizontalement, en mettant simplement à jour la coordonnée x.
Le problème est que le premier UIPanGestureRecognizer
est de prendre l'événement pour déplacer la vue verticalement, donc je ne peux pas utiliser le geste superview.
j'ai essayé
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldRecognizeSimultaneouslyWithGestureRecognizer:
(UIGestureRecognizer *)otherGestureRecognizer;
et les deux fonctionneront, mais je ne veux pas de ça. Je veux que l'horizontale ne soit détectée que si le mouvement est clairement horizontal. Ce serait donc génial si le UIPanGestureRecognizer
avait une propriété de direction.
Comment puis-je obtenir ce comportement? Je trouve la documentation très déroutante, alors peut-être que quelqu'un pourra mieux l'expliquer ici.
la source
Réponses:
Faites simplement ceci pour le reconnaissance de mouvement de panoramique vertical, cela fonctionne pour moi:
Et pour Swift:
la source
velocityInView
place detranslationInView
.J'ai créé une solution avec un sous-classement comme dans la réponse fournie par @LocoMike, mais j'ai utilisé le mécanisme de détection le plus efficace via la vitesse initiale fourni par @Hejazi. J'utilise également Swift, mais cela devrait être facile à traduire en Obj-C si vous le souhaitez.
Avantages par rapport aux autres solutions:
Voici le code:
Exemple d'utilisation:
la source
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);
Je l'ai compris en créant une sous-classe de UIPanGestureRecognizer
DirectionPanGestureRecognizer:
DirectionPanGestureRecognizer.m:
Cela ne déclenchera le geste que si l'utilisateur commence à faire glisser le comportement sélectionné. Définissez la propriété direction sur une valeur correcte et vous êtes tous ensemble.
la source
initWithTarget:action:
méthode et réinitialisation appelée et tout allait bien.DirectionPanGestureRecognizer
il ne tiendra pas compte des traînées rapides, sauf si vous définissezkDirectionPanThreshold = 20
ou ainsi, auquel cas il peut donner de fausses alarmes. Je suggère de mettre à laabs(_moveX) > abs(_moveY)
placeabs(_moveX) > kDirectionPanThreshold
et de changer le cas horizontal respectivement._drag = YES
j'ai ajoutéeself.state = UIGestureRecognizerStateChanged;
J'ai essayé de contraindre la zone valide horizontalement avec UIPanGestureRecognizer.
Alors, seulement à l' intérieur de glisser thresholdAngle degré peut déclencher horizontalement ce geste pan.
la source
Réponse Swift 3.0: il suffit de gérer le geste vertical
la source
La solution suivante a résolu mon problème:
Il s'agit en fait simplement de vérifier si le panoramique est en cours sur la vue principale ou tableView.
la source
Version Swift 3 de la réponse de Lee pour les paresseux
la source
J'ai pris la réponse de Lee Goodrich et l'ai étendue car j'avais besoin d'un panoramique à sens unique. Utilisez-le comme ceci:
let pan = PanDirectionGestureRecognizer(direction: .vertical(.up), target: self, action: #selector(handleCellPan(_:)))
J'ai également ajouté quelques commentaires pour clarifier un peu les décisions qui sont réellement prises.
la source
override func touchesMoved
-Method does not override any method from its superclass
.Vous pouvez trouver la direction qui
UIView
passeUIPanGestureRecognizer
. Veuillez suivre le code.la source
Swift 4.2
La solution est juste pour soutenir uniquement le geste panoramique verticalement, comme horizontal.
Solution 1 :
Solution 2:
Ensuite, le geste de balayage avalera le geste de panoramique. Bien sûr, vous n'avez rien à faire
swipeAction
.la source
Voici comment j'ai résolu:
J'ai d'abord activé la reconnaissance simultanée PanGesture.
Ensuite, j'isole les gestes de panoramique horizontal et vertical (l'accumulateur est la propriété NSMutableArray):
J'ai poussé un exemple ici:
ajouter un panoramique personnalisé dans la vue par défilement
la source
la source
Vous pouvez utiliser simple
panGestureRecognizer
. Pas besoin d'utiliserpandirectionregognizer
ou de trucs. Utilisez simplement la valeur y dutranslationInview
code ci - dessous déplacer la vue glisser uniquement vers le haut et le basla source
J'ai créé la méthode d'action PanGestureRecognizer @selector pour l'objet qui ne nécessitait que le défilement horizontal.
la source
Voie rapide
la source
Pour tous les utilisateurs de Swift, cela fera l'affaire :)
la source
J'ai pris une excellente réponse de Lee Goodrich et porté sur Swift 3
la source
J'adorerais partager mon approche car toutes les autres approches sont basées sur l'un
UIGestureRecognizerDelegate
ou l' autre des sous-classementsUIPanGestureRecognizer
.Mon approche est basée sur le runtime et le swizzling. Je ne suis pas sûr à 100% de cette approche, mais vous pouvez la tester et l'améliorer vous-même.
Définissez la direction de tout
UIPanGestureRecognizer
avec une seule ligne de code:utilisez
pod 'UIPanGestureRecognizerDirection'
ou le code:la source
J'ai essayé ceci: qui a fonctionné pour moi selon la question décrit
la source
SWIFT 4.2
Je suis allé plus loin et fais une direction Pan Gesture:
(Utilisé: https://github.com/fastred/SloppySwiper et https://stackoverflow.com/a/30607392/5790492 )
la source
Voici un geste de panoramique personnalisé dans Swift 5
U peut contraindre sa direction et l'angle maximum dans la direction, vous pouvez également contraindre sa vitesse minimum dans la direction.
appelle comme ça:
ou
la source
PanGestureRecognizer
interface contient les définitions suivantes:Je n'ai pas vérifié cela, mais c'est peut-être accessible via une sous-classe.
la source