Tengo una vista que tiene UIPanGestureRecognizerque arrastrar la vista verticalmente. Entonces, en la devolución de llamada del reconocedor, solo actualizo la coordenada y para moverla. La supervista de esta vista, tiene una UIPanGestureRecognizerque arrastrará la vista horizontalmente, simplemente actualizando la coordenada x.
El problema es que el primero UIPanGestureRecognizeres tomar el evento para mover la vista verticalmente, por lo que no puedo usar el gesto de supervista.
Yo he tratado
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldRecognizeSimultaneouslyWithGestureRecognizer:
(UIGestureRecognizer *)otherGestureRecognizer;
y ambos funcionarán, pero no quiero eso. Quiero que se detecte horizontalmente solo si el movimiento es claramente horizontal. Por lo tanto, sería genial si UIPanGestureRecognizertuviera una propiedad de dirección.
¿Cómo puedo lograr este comportamiento? Los documentos me parecen muy confusos, por lo que tal vez alguien pueda explicarlo mejor aquí.
fuente

Respuestas:
Simplemente haga esto para el reconocimiento vertical de gestos panorámicos, funciona para mí:
Y para Swift:
fuente
velocityInViewlugar detranslationInView.Creé una solución con subclases como en la respuesta proporcionada por @LocoMike, pero utilicé el mecanismo de detección más efectivo a través de la velocidad inicial proporcionada por @Hejazi. También estoy usando Swift, pero esto debería ser fácil de traducir a Obj-C si lo desea.
Ventajas sobre otras soluciones:
Aquí está el código:
Ejemplo de uso:
fuente
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);Lo descubrí creando una subclase de UIPanGestureRecognizer
DirectionPanGestureRecognizer:
DirectionPanGestureRecognizer.m:
Esto solo activará el gesto si el usuario comienza a arrastrar el comportamiento seleccionado. Establezca la propiedad de dirección en un valor correcto y ya está todo configurado.
fuente
initWithTarget:action:método y llamó a reset y todo estuvo bien.DirectionPanGestureRecognizerse ignorarán los arrastres rápidos, a menos que establezca máskDirectionPanThreshold = 20o menos, en cuyo caso puede dar falsas alarmas. Sugiero poner enabs(_moveX) > abs(_moveY)lugar deabs(_moveX) > kDirectionPanThresholdy cambiar el caso horizontal respectivamente._drag = YESque agreguéself.state = UIGestureRecognizerStateChanged;Traté de restringir el área válida horizontalmente con UIPanGestureRecognizer.
Entonces, sólo deslizar dentro thresholdAngle grados horizontalmente puede desencadenar este gesto sartén.
fuente
Respuesta de Swift 3.0: solo maneja el gesto vertical
fuente
La siguiente solución resolvió mi problema:
En realidad, esto solo verifica si la panorámica se realiza en la vista principal o tableView.
fuente
Versión de Swift 3 de la respuesta de Lee para los perezosos
fuente
Tomé la respuesta de Lee Goodrich y la extendí, ya que necesitaba específicamente una sola dirección panorámica. Úselo así:
let pan = PanDirectionGestureRecognizer(direction: .vertical(.up), target: self, action: #selector(handleCellPan(_:)))También agregué algunos comentarios para aclarar un poco más las decisiones que realmente se están tomando.
fuente
override func touchesMoved-Method does not override any method from its superclass.Puede encontrar la dirección arrastrando a
UIViewtravésUIPanGestureRecognizer. Por favor siga el código.fuente
Swift 4.2
La solución es solo para admitir gestos panorámicos verticalmente, igual que horizontal.
Solución 1 :
Solución 2:
Entonces el gesto de deslizar tragará el gesto de pan. Por supuesto, no necesitas hacer nada
swipeAction.fuente
Así es como lo resolví:
Primero habilité Simultáneamente el reconocimiento de PanGesture.
Luego aíslo los gestos de desplazamiento horizontal y vertical (el acumulador es la propiedad NSMutableArray):
Empujé un ejemplo aquí:
agregar pan personalizado en scrollview
fuente
fuente
Puedes usar simple
panGestureRecognizer. No es necesario usarpandirectionregognizerni cosas. Simplemente use el valor y de latranslationInviewvista de arrastrar y mover el código debajo solo hacia arriba y hacia abajofuente
Creé el método de acción PanGestureRecognizer @selector para el objeto que solo necesitaba desplazamiento horizontal.
fuente
Manera rápida
fuente
Para todos los usuarios de Swift, esto hará el trabajo :)
fuente
Tomé una excelente respuesta de Lee Goodrich y porté a Swift 3
fuente
Me encantaría compartir mi enfoque porque todos los demás enfoques se basan en una
UIGestureRecognizerDelegateo una subclaseUIPanGestureRecognizer.Mi enfoque se basa en tiempo de ejecución y swizzling. No estoy 100% seguro de este enfoque, pero puede probarlo y mejorarlo usted mismo.
Establezca la dirección de cualquiera
UIPanGestureRecognizercon solo una línea de código:uso
pod 'UIPanGestureRecognizerDirection'o el código:fuente
Intenté esto: lo que funcionó para mí según la pregunta describe
fuente
SWIFT 4.2
Fui más lejos y tomé una dirección Pan Gesture:
(Utilizado: https://github.com/fastred/SloppySwiper y https://stackoverflow.com/a/30607392/5790492 )
fuente
Aquí hay un gesto panorámico personalizado en Swift 5
U puede restringir su dirección y el ángulo máximo en la dirección, también puede restringir su velocidad mínima en la dirección.
llama así:
o
fuente
PanGestureRecognizerLa interfaz contiene las siguientes definiciones:No revisé esto, pero tal vez sea accesible a través de la subclase.
fuente