Reconhecedores de gestos simultâneos no iPhone SDK
-
26-09-2019 - |
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!
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
.