UISwipeGestureRecognizer @selector não está sendo chamado devido à configuração do UIPanGestureRecognizer

StackOverflow https://stackoverflow.com//questions/22055625

Pergunta

No meu aplicativo iOS, tenho a seguinte configuração:

- (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];
           }
        }
     }
 }

então o problema é que handleSwipe nunca é chamado ... quando comento a configuração do UIPanGestureRecognizer, o handleSwipe começa a funcionar.

Sou muito novo na programação de reconhecimento de gestos, então presumo que esteja faltando algo fundamental aqui.

Qualquer tipo de ajuda é muito apreciada!

Foi útil?

Solução

Você precisa dizer aos gestos como interagir entre si.Isso pode ser feito deixando-os rodar ao mesmo tempo (o padrão é que não o façam) ou configurando um para funcionar somente se o outro falhar.

Para fazer com que ambos funcionem, faça da sua aula o delegate pelos gestos e implementar

– gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:

para retornar YES.

Para definir um para funcionar apenas se o outro falhar, use requireGestureRecognizerToFail:.

Outras dicas

Os gestos de deslizar e deslocar são muito semelhantes e isso causa confusão,

Existem alguns remédios:

  1. Não configure o movimento panorâmico e o deslizamento na mesma visualização - ele pode ser definido em subvisualizações diferentes para evitar confusões.

  2. Use outro reconhecedor para deslizar para alternar como um toque duplo ou um toque de 2 dedos, pois isso não pode ser interpretado como uma panorâmica

  3. Use o Método Delegado - GestureCognizer: Deveri que não tenha sido criado para obter o TestureReCognizer:

    por exemplo, para chaco se os toques começaram na área do painel/barra de ferramentas e falharam no reconhecedor de pan permitindo o uso do furto.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top