Tengo una vista que tiene UIPanGestureRecognizer
que 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 UIPanGestureRecognizer
que arrastrará la vista horizontalmente, simplemente actualizando la coordenada x.
El problema es que el primero UIPanGestureRecognizer
es 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 UIPanGestureRecognizer
tuviera 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
velocityInView
lugar 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.DirectionPanGestureRecognizer
se ignorarán los arrastres rápidos, a menos que establezca máskDirectionPanThreshold = 20
o menos, en cuyo caso puede dar falsas alarmas. Sugiero poner enabs(_moveX) > abs(_moveY)
lugar deabs(_moveX) > kDirectionPanThreshold
y cambiar el caso horizontal respectivamente._drag = YES
que 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
UIView
travé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 usarpandirectionregognizer
ni cosas. Simplemente use el valor y de latranslationInview
vista 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
UIGestureRecognizerDelegate
o 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
UIPanGestureRecognizer
con 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
PanGestureRecognizer
La interfaz contiene las siguientes definiciones:No revisé esto, pero tal vez sea accesible a través de la subclase.
fuente