23

¿Cómo te configuración de los reconocedores gesto para que pudiera tener un UISwipeGestureRecognizer y una UIPanGestureRecognizer trabajar al mismo tiempo? De modo que si toca y se mueve rápidamente (deslizamiento rápido), detecta el gesto como un deslizamiento, pero si toca y luego se mueve (un pequeño retraso entre tocar & mover) lo detecta como una panorámica?Cómo tener un trabajo UISwipeGestureRecognizer Y UIPanGestureRecognizer en el mismo punto de vista

He intentado varias permutaciones de requireGestureRecognizerToFail y eso no ayudó precisamente, lo hizo de manera que si el SwipeGesture se dejó entonces mi gesto sartén trabajaría hacia arriba, abajo ya la derecha, pero cualquier movimiento fue detectado por la izquierda el gesto de deslizar.

Respuesta

51

Vas a querer establecer una de las dos UIGestureRecognizer 's delegados a un objeto que tenga sentido (probablemente self) a continuación, escuchar, y volver YES para este method:

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

Este método es se llamó cuando el reconocimiento de un gesto gestureRecognizer o otherGestureRecognizer bloquearía al otro reconocedor de gestos para que no reconociera su gesto. Tenga en cuenta que devolver YES garantiza el reconocimiento simultáneo; devolver NO, por otro lado, no se garantiza que impida el reconocimiento simultáneo porque el otro delegado reconocedor de gestos puede devolver YES.

+0

funcionó como un encanto. Muchas gracias –

+0

gracias, ayudó mucho! – Mateus

5

Using a pan recognizer to detect swipping and panning:

- (void)setupRecognizer 
{ 
    UIPanGestureRecognizer* panSwipeRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanSwipe:)]; 
    // Here you can customize for example the minimum and maximum number of fingers required 
    panSwipeRecognizer.minimumNumberOfTouches = 2; 
    [targetView addGestureRecognizer:panSwipeRecognizer]; 
} 

#define SWIPE_UP_THRESHOLD -1000.0f 
#define SWIPE_DOWN_THRESHOLD 1000.0f 
#define SWIPE_LEFT_THRESHOLD -1000.0f 
#define SWIPE_RIGHT_THRESHOLD 1000.0f 

- (void)handlePanSwipe:(UIPanGestureRecognizer*)recognizer 
{ 
    // Get the translation in the view 
    CGPoint t = [recognizer translationInView:recognizer.view]; 
    [recognizer setTranslation:CGPointZero inView:recognizer.view]; 

    // TODO: Here, you should translate your target view using this translation 
    someView.center = CGPointMake(someView.center.x + t.x, someView.center.y + t.y); 

    // But also, detect the swipe gesture 
    if (recognizer.state == UIGestureRecognizerStateEnded) 
    { 
     CGPoint vel = [recognizer velocityInView:recognizer.view]; 

     if (vel.x < SWIPE_LEFT_THRESHOLD) 
     { 
      // TODO: Detected a swipe to the left 
     } 
     else if (vel.x > SWIPE_RIGHT_THRESHOLD) 
     { 
      // TODO: Detected a swipe to the right 
     } 
     else if (vel.y < SWIPE_UP_THRESHOLD) 
     { 
      // TODO: Detected a swipe up 
     } 
     else if (vel.y > SWIPE_DOWN_THRESHOLD) 
     { 
      // TODO: Detected a swipe down 
     } 
     else 
     { 
      // TODO: 
      // Here, the user lifted the finger/fingers but didn't swipe. 
      // If you need you can implement a snapping behaviour, where based on the location of your   targetView, 
      // you focus back on the targetView or on some next view. 
      // It's your call 
     } 
    } 
} 
+0

¡Hermoso! Funcionó bien para mí! –

2

Por defecto, cuando el usuario intenta deslizar, el gesto se interpreta como una cacerola. Esto se debe a que un gesto de deslizamiento cumple con las condiciones necesarias para ser interpretado como una panorámica (un gesto continuo) antes de que cumpla con las condiciones necesarias para ser interpretado como deslizar (un gesto discreto).

que usted necesita indicar una relación entre dos reconocedores gesto llamando al requireGestureRecognizerToFail: método en el reconocedor gesto que desea retrasar

[self.panRecognizer requireGestureRecognizerToFail:self.swipeRecognizer]; 
0

Aquí es una solución completa para la detección de direcciones panorámicas y con banda magnética (utilizando 2cupsOfTech de lógica swipeThreshold):

public enum PanSwipeDirection: Int { 
    case up, down, left, right, upSwipe, downSwipe, leftSwipe, rightSwipe 
    public var isSwipe: Bool { return [.upSwipe, .downSwipe, .leftSwipe, .rightSwipe].contains(self) } 
    public var isVertical: Bool { return [.up, .down, .upSwipe, .downSwipe].contains(self) } 
    public var isHorizontal: Bool { return !isVertical } 
} 

public extension UIPanGestureRecognizer { 

    public var direction: PanSwipeDirection? { 
     let SwipeThreshold: CGFloat = 1000 
     let velocity = self.velocity(in: view) 
     let isVertical = fabs(velocity.y) > fabs(velocity.x) 
     switch (isVertical, velocity.x, velocity.y) { 
     case (true, _, let y) where y < 0: return y < -SwipeThreshold ? .upSwipe : .up 
     case (true, _, let y) where y > 0: return y > SwipeThreshold ? .downSwipe : .down 
     case (false, let x, _) where x > 0: return x > SwipeThreshold ? .rightSwipe : .right 
     case (false, let x, _) where x < 0: return x < -SwipeThreshold ? .leftSwipe : .left 
     default: return nil 
     } 
    } 

} 

Uso:

@IBAction func handlePanOrSwipe(recognizer: UIPanGestureRecognizer) { 

    if let direction = recognizer.direction { 
     if direction == .leftSwipe { 
      //swiped left 
     } else if direction == .up { 
      //panned up 
     } else if direction.isVertical && direction.isSwipe { 
      //swiped vertically 
     } 
    } 

} 
Cuestiones relacionadas