Respuesta

11

se les puede llamar de forma paralela mediante la aplicación del siguiente método de la UIGestureRecognizerDelegate protocolo:

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

Estoy usando "https://github.com/XavierDK/XDKAirMenu" y también estoy usando el gesto de deslizar en uno de mis controladores para que este delegado no funcione para mí – iAnkit

9

Hay una propiedad en la clase UIGestureRecognizer llamada "cancelsTouchesInView" que tiene como valor predeterminado YES. Esto hará que se cancelen todos los gestos pendientes. El gesto Pan se está reconociendo primero, ya que no necesita tener un evento de "retoque", por lo que cancela el gesto Deslizar.

Si usted quiere que ambos gestos para ser reconocidos, trate de añadir:

[yourPanGestureInstance setCancelsTouchesInView:NO];

+0

gracias por el contestador pero este método todavía no identifican el gesto de deslizar – NIKHIL

+1

También he probar el método de shouldRecognizeSimultaneouslyWithGestureRecognizer Dentro del UIGestureRecognizer.H presentar – NIKHIL

+1

¿Ha intentado utilizar requireGestureRecognizerToFail :? –

0

Dar prioridad para deslizar

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

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

myPanGesture.require(toFail: mySwipeGestureRecognizer) 

Ahora su sartén sólo ejecutará si su golpe falla.


Uso sartén por todo

Si el golpe y pan reconocedores gesto no se llevan bien con esta configuración, se puede rodar toda la lógica en la sartén reconocedor de gestos para un mayor 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

Cuestiones relacionadas