recognizer iphone swipe

iphone - Configuración de dirección para UISwipeGestureRecognizer



uipangesturerecognizer swift 4 (12)

Quiero agregar el simple reconocimiento de gestos de deslizamiento a mi proyecto basado en iPhone. Deben reconocerse los gestos en todas las direcciones (derecha, abajo, izquierda, arriba).

Se indica en los documentos para UISwipeGestureRecognizer:

Puede especificar varias direcciones especificando múltiples constantes UISwipeGestureRecognizerDirection utilizando operandos a nivel de bits OR. La dirección predeterminada es UISwipeGestureRecognizerDirectionRight.

Sin embargo, para mí no funciona. Cuando las cuatro direcciones están en OR, solo se reconocen los golpes hacia la izquierda y la derecha.

- (void)viewDidLoad { UISwipeGestureRecognizer *recognizer; recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)]; [recognizer setDirection:(UISwipeGestureRecognizerDirectionRight | UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionLeft | UISwipeGestureRecognizerDirectionUp)]; [[self view] addGestureRecognizer:recognizer]; [recognizer release]; [super viewDidLoad]; } -(void)handleSwipeFrom:(UISwipeGestureRecognizer *)recognizer { NSLog(@"Swipe received."); }

Lo arreglé con la adición de cuatro reconocedores a la vista, pero tengo curiosidad por saber por qué no funcionó como se anuncia en los documentos.

- (void)viewDidLoad { UISwipeGestureRecognizer *recognizer; recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)]; [recognizer setDirection:(UISwipeGestureRecognizerDirectionRight)]; [[self view] addGestureRecognizer:recognizer]; [recognizer release]; recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)]; [recognizer setDirection:(UISwipeGestureRecognizerDirectionUp)]; [[self view] addGestureRecognizer:recognizer]; [recognizer release]; recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)]; [recognizer setDirection:(UISwipeGestureRecognizerDirectionDown)]; [[self view] addGestureRecognizer:recognizer]; [recognizer release]; recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)]; [recognizer setDirection:(UISwipeGestureRecognizerDirectionLeft)]; [[self view] addGestureRecognizer:recognizer]; [recognizer release]; [super viewDidLoad]; } -(void)handleSwipeFrom:(UISwipeGestureRecognizer *)recognizer { NSLog(@"Swipe received."); }


Swift 2.1

Tuve que usar el siguiente

for var x in [ UISwipeGestureRecognizerDirection.Left, UISwipeGestureRecognizerDirection.Right, UISwipeGestureRecognizerDirection.Up, UISwipeGestureRecognizerDirection.Down ] { let r = UISwipeGestureRecognizer(target: self, action: "swipe:") r.direction = x self.view.addGestureRecognizer(r) }


Aquí hay un ejemplo de código para el uso de UISwipeGestureRecognizer. Nota comentarios.

- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. //add gesture recognizer. The ''direction'' property of UISwipeGestureRecognizer only sets the allowable directions. It does not return to the user the direction that was actaully swiped. Must set up separate gesture recognizers to handle the specific directions for which I want an outcome. UISwipeGestureRecognizer *gestureRight; UISwipeGestureRecognizer *gestureLeft; gestureRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeRight:)];//direction is set by default. gestureLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeLeft:)];//need to set direction. [gestureLeft setDirection:(UISwipeGestureRecognizerDirectionLeft)]; //[gesture setNumberOfTouchesRequired:1];//default is 1 [[self view] addGestureRecognizer:gestureRight];//this gets things rolling. [[self view] addGestureRecognizer:gestureLeft];//this gets things rolling. }

swipeRight y swipeLeft son métodos que utiliza para realizar actividades específicas basadas en deslizar hacia la izquierda o hacia la derecha. Por ejemplo:

- (void)swipeRight:(UISwipeGestureRecognizer *)gesture { NSLog(@"Right Swipe received.");//Lets you know this method was called by gesture recognizer. NSLog(@"Direction is: %i", gesture.direction);//Lets you know the numeric value of the gesture direction for confirmation (1=right). //only interested in gesture if gesture state == changed or ended (From Paul Hegarty @ standford U if ((gesture.state == UIGestureRecognizerStateChanged) || (gesture.state == UIGestureRecognizerStateEnded)) { //do something for a right swipe gesture. } }


Bueno, eso apesta, resolví el problema agregando 2 gestos como mencionó Lars y que funcionaron perfectamente ...

1) Izquierda / Derecha 2) Arriba / Abajo

UISwipeGestureRecognizer *swipeLeftRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)]; [swipeLeftRight setDirection:(UISwipeGestureRecognizerDirectionRight | UISwipeGestureRecognizerDirectionLeft )]; [self.view addGestureRecognizer:swipeLeftRight]; UISwipeGestureRecognizer *swipeUpDown = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)]; [swipeUpDown setDirection:(UISwipeGestureRecognizerDirectionUp | UISwipeGestureRecognizerDirectionDown )]; [self.view addGestureRecognizer:swipeUpDown];


Esto me estaba volviendo loco. Finalmente descubrí una forma confiable de tener múltiples swipeGestureRecognizers.

Parece que hay un error en iOS si el nombre de su selector de "acción" es el mismo en varios swipeGestureRecognizers. Si los nombra de manera diferente, por ejemplo, handleLeftSwipeFrom y handleRightSwipeFrom, todo funciona.

UISwipeGestureRecognizer *recognizer; recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleLeftSwipeFrom:)]; [recognizer setDirection:(UISwipeGestureRecognizerDirectionLeft)]; [[self view] addGestureRecognizer:recognizer]; [recognizer release]; recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleRightSwipeFrom:)]; [recognizer setDirection:(UISwipeGestureRecognizerDirectionRight)]; [[self view] addGestureRecognizer:recognizer]; [recognizer release];


Noté que los gestos izquierda / derecha y arriba / abajo trabajan juntos en pares, por lo que solo necesita especificar dos reconocedores de gestos. Y los documentos parecen estar equivocados.


Parece que hay un error. Puede especificar la (s) dirección (es) permitida (s) como lo hizo. Pero cuando intenta acceder a la dirección real que activó el deslizamiento en el método del selector de acción, todavía obtiene la máscara de bits que estableció originalmente (para las direcciones permitidas).

Esto significa que las comprobaciones para la dirección real siempre fallarán cuando se permita más de 1 dirección. Puede verlo usted mismo con bastante facilidad cuando saca el valor de ''dirección'' en el método selector (es decir -(void)scrollViewSwiped:(UISwipeGestureRecognizer *)recognizer ).

Presentó un informe de error (# 8276386) a Apple.

[Actualización] Recibí una respuesta de Apple diciendo que el comportamiento funciona como estaba previsto.

Entonces, por ejemplo, en una vista de tabla puede deslizar hacia la izquierda o hacia la derecha en una celda de vista de tabla para activar ''eliminar'' (esto tendría las direcciones del gesto de deslizar establecidas a la izquierda y a la derecha)

Esto significa que la solución original es la que se supone debe usarse. La propiedad de dirección solo se puede usar para obtener los gestos reconocidos correctamente, pero no en el método realizado en un reconocimiento exitoso para comparar la dirección real que activó el reconocimiento.


Si desea que detecte las cuatro direcciones, tendrá que crear cuatro instancias, como lo hizo en su trabajo alternativo.

He aquí el por qué : la misma instancia de UISwipeGestureRecognizer que usted crea es la instancia que pasa al selector como remitente. Entonces, si configura que reconozca las cuatro direcciones, volverá a ser verdadero para sgr.direction == xxx donde xxx es una de las cuatro direcciones.

Aquí hay una solución alternativa que implica menos código (supone el uso de ARC):

for(int d = UISwipeGestureRecognizerDirectionRight; d <= UISwipeGestureRecognizerDirectionDown; d = d*2) { UISwipeGestureRecognizer *sgr = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)]; sgr.direction = d; [self.view addGestureRecognizer:sgr]; }


Si usa Xcode 4.2, puede agregar Gesture Recognizers @ al guión gráfico y luego vincular los reconocedores de gestos de GUI a IBActions.

Puede encontrar los Reconocedores de Gestos en la Biblioteca de Objetos del Panel de Utilidades (La parte inferior del panel de la Derecha).

Entonces solo es cuestión de controlar-arrastrando a la acción apropiada.


hmm, extraño, funciona perfecto para mí, hago exactamente lo mismo

creo que deberías probar mirar

Método UIGestureRecognizerDelegate

- (BOOL)gestureRecognizerShouldBegin:(UISwipeGestureRecognizer *)gestureRecognizer { // also try to look what''s wrong with gesture NSLog(@"should began gesture %@", gestureRecognizer); return YES; }

en los registros debe ver algo como:

debería comenzar gesto; target = <(action = actionForUpDownSwipeGestureRecognizer :, target =)>; dirección = arriba, abajo, izquierda, derecha>


usa esto, debería ser la operación de bit

gesture.direction & UISwipeGestureRecognizerDirectionUp || gesture.direction & UISwipeGestureRecognizerDirectionDown


UISwipeGestureRecognizer *Updown=[[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(handleGestureNext:)]; Updown.delegate=self; [Updown setDirection:UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionUp]; [overLayView addGestureRecognizer:Updown]; UISwipeGestureRecognizer *LeftRight=[[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(handleGestureNext:)]; LeftRight.delegate=self; [LeftRight setDirection:UISwipeGestureRecognizerDirectionLeft | UISwipeGestureRecognizerDirectionRight]; [overLayView addGestureRecognizer:LeftRight]; overLayView.userInteractionEnabled=NO; -(void)handleGestureNext:(UISwipeGestureRecognizer *)recognizer { NSLog(@"Swipe Recevied"); //Left //Right //Top //Bottom }


UISwipeGestureRecognizer *recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(didSwipe:)]; [recognizer setDirection:(UISwipeGestureRecognizerDirectionRight)]; [self.view addGestureRecognizer:recognizer]; [recognizer release]; recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(didSwipe:)]; [recognizer setDirection:(UISwipeGestureRecognizerDirectionLeft)]; [self.view addGestureRecognizer:recognizer]; [recognizer release];

Ahora esta es la función didSwipe

- (void) didSwipe:(UISwipeGestureRecognizer *)recognizer{ if([recognizer direction] == UISwipeGestureRecognizerDirectionLeft){ //Swipe from right to left //Do your functions here }else{ //Swipe from left to right //Do your functions here } }