iphone - uipangesturerecognizer swift 4
Reconocedores de gestos simultáneos en Iphone SDK (5)
Necesito capturar dos gestos de deslizamiento diferentes utilizando UISwipeGestureRecognizer
(por ejemplo, UISwipeGestureRecognizerDirectionRight
y UISwipeGestureRecognizerDirectionLeft
). Cuando agrego dos reconocedores diferentes con el método addGestureRecognizer , solo funciona el último reconocedor agregado. He leído que necesito implementar gestureRecognizer: shouldRecognizeSimultaneouslyWithGestureRecognizer: método del protocolo UIGestureRecognizerDelegate
, pero nada funciona.
¿Alguien puede ayudar con un simple ejemplo de atrapar dos o más gestos iguales? ¡Gracias!
Fue realmente fácil:
Al principio deberíamos crear una clase que implemente el protocolo UIGestureRecognizerDelegate
:
@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;
}
Y úsalo así:
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];
Gracias a la sugerencia de user294890, tuve éxito al devolver yes de los métodos enumerados de UIGestureRecognizerDelegate
.
Sin embargo, encontré que no funcionaría cuando estaba agregando el GestureRecognizer antes de que la vista web se haya cargado. Sin embargo, funcionó cuando agregué el GestureRecognizer a la vista web en el método delegado de webView:
- (void)webViewDidFinishLoad:(UIWebView *)webView
.
La respuesta: "Um, un vistazo rápido a la documentación ..." de Phoenix ¡absolutamente no funcionará!
Está configurando una máscara, luego usa la misma variable para probarla como si el reconocedor la despejara y configurara un solo bit. Almacena, como citó correctamente de la documentación:
Las direcciones permitidas del deslizamiento
sender.direction
simplemente devolverá la máscara que estableció inicialmente y en su ejemplo, ¡nunca se resolverá en una sola dirección!
UISwipeGestureRecognizerDirectionRight == 1
UISwipeGestureRecognizerDirectionRight | UISwipeGestureRecognizerDirectionLeft == 3
Además, para la mayoría de los casos no es necesario que:
- configurar un delegado
- permitir el reconocimiento simultáneo de gestos (a menos que desee golpes simultáneos; no es probable)
- enviar el reconocedor al selector
Lo siguiente funciona para mí:
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];
Sugiero que leas un poco sobre la técnica que utilizan los reconocedores de gestos para reconocer el gesto. Supongo que el primer reconocedor intenta reconocer el gesto, pero se da cuenta de que no tiene que responder y, de algún modo, no lo transmite.
Es muy útil leer cómo funcionan para comprender cómo usarlos.
Espero que esto ayude.
Um, un vistazo rápido a la documentación revelaría que estás haciendo mucho más trabajo de lo que necesitas:
"direction Las direcciones permitidas del deslizamiento.
@property(nonatomic) UISwipeGestureRecognizerDirection direction
Discusión Puede especificar múltiples direcciones especificando múltiples constantes UISwipeGestureRecognizerDirection
usando operando a nivel de bits OR. La dirección predeterminada es UISwipeGestureRecognizerDirectionRight
. "
Lo que quiere decir que, en lugar de utilizar dos UISwipeGestureRecognizers, puede hacer lo siguiente:
UISwipeGestureRecognizer *swipeGesture = [[UISwipeGestureRecognizer alloc]
initWithTarget:self action:@selector(handleSwipeGesture:)];
swipeGesture.direction = UISwipeGestureRecognizerDirectionRight | UISwipeGestureRecognizerDirectionLeft;
Y en tu método de acción:
-(IBAction)handleSwipeGesture:(UISwipeGestureRecognizer*)sender
{
if (sender.direction == UISwipeGestureRecognizerDirectionLeft) {
//do left action
} else {
//do right action
}
}
Mucho más simple, y mucho menos propenso al conflicto.