Pergunta

Eu preciso pegar dois gestos de sujeira diferentes usando UISwipeGestureRecognizer(por exemplo, UISwipeGestureRecognizerDirectionRight e UISwipeGestureRecognizerDirectionLeft). Quando adiciono dois reconhistas diferentes com AddestureRecognizer Método, apenas o reconhecedor adicionado pela última vez funciona. Eu li que preciso implementar GestureRecognizer: deve ser reconhecido como o TestureRecognizer: método de UIGestureRecognizerDelegate protocolo, mas nada funciona.

Alguém pode ajudar com um exemplo simples de capturar dois ou mais mesmos gestos? Obrigado!

Foi útil?

Solução

Foi muito fácil:

No começo, devemos criar aula, que implementa UIGestureRecognizerDelegate protocolo:

@interface MyGestureDelegate : NSObject <UIGestureRecognizerDelegate>

@implementation MyGestureDelegate

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

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

E use assim:


    UISwipeGestureRecognizer *swipeGestureLeft = [[UISwipeGestureRecognizer alloc]
                                              initWithTarget:self action:@selector(handleSwipeGestureLeft:)];
    [self.view addGestureRecognizer:swipeGestureLeft];
    swipeGestureLeft.direction = UISwipeGestureRecognizerDirectionLeft;
    [swipeGestureLeft release];

    UISwipeGestureRecognizer *swipeGesture = [[UISwipeGestureRecognizer alloc]
                                          initWithTarget:self action:@selector(handleSwipeGesture:)];
    swipeGesture.direction = UISwipeGestureRecognizerDirectionRight;
    [self.view addGestureRecognizer:swipeGesture];

    MyGestureDelegate *deleg = [[MyGestureDelegate alloc] init];

    [swipeGesture setDelegate:deleg];
    [swipeGesture release];

Outras dicas

A resposta: "Hum, uma rápida olhada na documentação ..." de Phoenix absolutamente não funcionará!

Ele está definindo uma máscara e, em seguida, usando a mesma variável para testar, como se o reconhecedor a limpar e definir um único bit. Ele armazena, como ele citou corretamente a documentação:

As direções permitidas do furto

sender.direction

Simplesmente retornará a máscara que você definiu inicialmente e no exemplo dele, nunca resolverá uma única direção!

UISwipeGestureRecognizerDirectionRight == 1
UISwipeGestureRecognizerDirectionRight | UISwipeGestureRecognizerDirectionLeft == 3

Adicional, para a maioria dos casos que você não precisa:

  • Configure um delegado
  • Permita o reconhecimento simultâneo de gestos (a menos que você queira furtos simultâneos; não provável)
  • Envie o reconhecedor para o seletor

O seguinte funciona para mim:

   UISwipeGestureRecognizer* swipe;

   swipe = [[[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeL)] autorelease];
   swipe.direction = UISwipeGestureRecognizerDirectionLeft;
   [view addGestureRecognizer:swipe];

   swipe = [[[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeR)] autorelease];
   swipe.direction = UISwipeGestureRecognizerDirectionRight; // default
   [view addGestureRecognizer:swipe];

Hum, uma rápida olhada na documentação revelaria que você está fazendo muito mais trabalho do que precisa:

"Direção as direções permitidas do toque.

@property(nonatomic) UISwipeGestureRecognizerDirection direction

Discussão você pode especificar várias direções especificando múltiplos UISwipeGestureRecognizerDirection Constantes usando operando bit-ou ou operando. A direção padrão é UISwipeGestureRecognizerDirectionRight."

Ou seja, em vez de usar dois UiswipeGestureRecognizers, você pode simplesmente fazer o seguinte:

UISwipeGestureRecognizer *swipeGesture = [[UISwipeGestureRecognizer alloc]
                                      initWithTarget:self action:@selector(handleSwipeGesture:)];

 swipeGesture.direction = UISwipeGestureRecognizerDirectionRight | UISwipeGestureRecognizerDirectionLeft;

E em seu método de ação:

  -(IBAction)handleSwipeGesture:(UISwipeGestureRecognizer*)sender
     {
     if (sender.direction == UISwipeGestureRecognizerDirectionLeft) {

         //do left action

     } else {

         //do right action

     }
}

Muito mais simples e muito menos propenso a conflitos.

Eu sugiro que você leia um pouco sobre a técnica que os reconhecedores de gestos usam para reconhecer o gesto. Suponho que o primeiro reconhecedor tenta reconhecer o gesto, mas percebe que ele não precisa responder a ele e, de alguma forma, ele não o transfere.

É muito útil ler como eles funcionam para entender como usá -los.

Espero que isto ajude.

Graças à sugestão do usuário294890, fui bem -sucedido retornando sim da listada UIGestureRecognizerDelegate métodos.

No entanto, descobri que não funcionaria quando eu estava adicionando o GestureRecognizer antes que a visualização da web tivesse carregado. No entanto, funcionou quando adicionei o GestureRecognizer ao WebView no método Delegate da WebView:

- (void)webViewDidFinishLoad:(UIWebView *)webView.

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