Pregunta

Estoy desarrollando una aplicación donde he usado el gesto de la sartén y el gesto de deslizamiento. Entonces, cada vez que hago el gesto de deslizamiento, pero el método del gesto de la sartén siempre se llama y no se llama el método de gesto de deslizamiento.

¿Hay alguna prioridad entre todo el método de gesto?

¿Fue útil?

Solución

Puede llamarlos en paralelo implementando el siguiente método del UIGestureRecognizerDelegate protocolo:

- (BOOL)gestureRecognizer:(UIPanGestureRecognizer *)gestureRecognizer 
shouldRecognizeSimultaneouslyWithGestureRecognizer:(UISwipeGestureRecognizer *)otherGestureRecognizer
{
    return YES;
}

Otros consejos

Hay una propiedad en el UIGestureRecognizer clase llamada "CancelstouchesInview" que vale la pena a YES. Esto hará que se cancelen los gestos pendientes. El gesto de la sartén se reconoce primero, ya que no necesita tener un evento de "retoque", por lo que cancela el gesto de deslizamiento.

Si desea que sean reconocidos ambos gestos, intente agregar:

[yourPanGestureInstance setCancelsTouchesInView:NO];

Dar prioridad para deslizar

Puedes dar prioridad a un UIGestureRecognizer con el require(toFail:) método.

@IBOutlet var myPanGestureRecognizer: UIPanGestureRecognizer!
@IBOutlet var mySwipeGestureRecognizer: UISwipeGestureRecognizer!

myPanGesture.require(toFail: mySwipeGestureRecognizer)

Ahora tu sartén solo se ejecutará si su golpe fuerte falla.


Usar sartén para todo

Si el golpe fuerte y sartén Los reconocedores de gestos no juegan bien con esta configuración, puedes llevar toda tu lógica en el sartén Reconocador de gestos para más control.

let minHeight: CGFloat = 100
let maxHeight: CGFloat = 700
let swipeVelocity: CGFloat = 500
var previousTranslationY: CGFloat = 0

@IBOutlet weak var cardHeightConstraint: NSLayoutConstraint!

@IBAction func didPanOnCard(_ sender: Any) {

    guard let panGesture = sender as? UIPanGestureRecognizer else { return }

    let gestureEnded = bool(panGesture.state == UIGestureRecognizerState.ended)
    let velocity = panGesture.velocity(in: self.view)

    if gestureEnded && abs(velocity.y) > swipeVelocity {
        handlePanOnCardAsSwipe(withVelocity: velocity.y)
    } else {
        handlePanOnCard(panGesture)
    }
} 

func handlePanOnCard(_ panGesture: UIPanGestureRecognizer) {

    let translation = panGesture.translation(in: self.view)
    let translationYDelta = translation.y - previousTranslationY

    if abs(translationYDelta) < 1 { return } // ignore small changes

    let newCardHeight = cardHeightConstraint.constant - translationYDelta

    if newCardHeight > minHeight && newCardHeight < maxHeight {
        cardHeightConstraint.constant = newCardHeight
        previousTranslationY = translation.y
    }

    if panGesture.state == UIGestureRecognizerState.ended {
        previousTranslationY = 0
    }
}

func handlePanOnCardAsSwipe(withVelocity velocity: CGFloat) {
    if velocity.y > 0 {
        dismissCard() // implementation not shown
    } else {
        maximizeCard() // implementation not shown
    }
}

Aquí hay una demostración del código anterior en acción.

enter image description here

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top