Pregunta

En mi app de iOS, tengo la siguiente configuración:

- (void)setupGestures
{
   UIPanGestureRecognizer* panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGesture:)];                                                           
   [self.view addGestureRecognizer:panRecognizer];

   UISwipeGestureRecognizer* swipeUpRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipe:)];

   [swipeUpRecognizer setDirection:UISwipeGestureRecognizerDirectionUp];
   [self.view addGestureRecognizer:swipeUpRecognizer];
}

// then I have following implementation of selectors

// this method supposed to give me the length of the swipe

- (void)panGesture:(UIPanGestureRecognizer *)sender 
{
   if (sender.state == UIGestureRecognizerStateBegan)
   {
      startLocation = [sender locationInView:self.view];
   }
   else if (sender.state == UIGestureRecognizerStateEnded)
   {
      CGPoint stopLocation = [sender locationInView:self.view];
      CGFloat dx = stopLocation.x - startLocation.x;
      CGFloat dy = stopLocation.y - startLocation.y;
      CGFloat distance = sqrt(dx*dx + dy*dy );
      NSLog(@"Distance: %f", distance);
   }
 }

 // this  method does all other actions related to swipes

- (void)handleSwipe:(UISwipeGestureRecognizer *)gestureRecognizer
{
 UISwipeGestureRecognizerDirection direction = [gestureRecognizer direction];
     CGPoint touchLocation = [gestureRecognizer locationInView:playerLayerView];

     if (direction == UISwipeGestureRecognizerDirectionDown && touchLocation.y >  (playerLayerView.frame.size.height * .5))
     {
        if (![toolbar isHidden])
        {
           if (selectedSegmentIndex != UISegmentedControlNoSegment)
           {
              [self dismissBottomPanel];
           }
           else
           {
             [self dismissToolbar];
           }
        }
     }
 }

así que el problema es que handleSwipe nunca es recibir llamadas...cuando yo comente la UIPanGestureRecognizer, el handleSwipe comienza a trabajar.

Soy bastante nuevo para el reconocimiento de gestos de programación, así que estoy asumiendo que me estoy perdiendo algo fundamental aquí.

Cualquier tipo de ayuda es muy apreciada!

¿Fue útil?

Solución

Usted necesita decirle a los gestos de cómo interactúan el uno con el otro.Que se puede hacer dejándolas correr al mismo tiempo (por defecto es que no) o mediante el establecimiento de un trabajo si el otro falla.

Para hacerlos trabajar, hacer su clase de la delegate por los gestos y aplicar

– gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:

para volver YES.

Para establecer uno para trabajar sólo si el otro falla, el uso de requireGestureRecognizerToFail:.

Otros consejos

Los gestos de deslizamiento y sartén son muy similares y eso causa la confusión,

Hay algunos remedios:

  1. No configure la bandeja y deslice en la misma vista: se puede configurar en una Subvisión diferente para evitar confusiones.

  2. Use otro reconocedor para deslizar para alternar como un toque doble o un toque de 2 dedos, ya que esto no se puede interpretar como una PAN

  3. Usa el método delegado - Gesturerecognizer: debería serererequiredToFailbyGesturerCognizer:

    Por ejemplo, a Chaco, si los toques comenzaron en el área de la barra de herramientas / panel y fallan, el reconocedor PAN, lo que permite que se use un golpe.

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