18

necesito detectar la dirección de mi gesto de deslizar y tengo un problema con él. gesto está funcionando, pero no sé cómo detectar la dirección. ...cómo detectar deslizar la dirección del gesto?

swipeGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(detectSwipe:)]; 
[swipeGesture setNumberOfTouchesRequired:1]; 
[swipeGesture setDirection:UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionUp]; 
[appView addGestureRecognizer:swipeGesture]; 

-(void)detectSwipe:(UISwipeGestureRecognizer *)recognizer { 
switch (recognizer.direction) { 
    case UISwipeGestureRecognizerDirectionUp: 
     NSLog(@"smth1"); 
     break; 


    case UISwipeGestureRecognizerDirectionDown: 
     NSLog(@"smth2"); 
    default: 
     break; 
} 
} 

que no está funcionando:/

+0

Por favor, defina ¿El registro tiene el valor incorrecto? ¿No registra nada? ¿No se está llamando a detectSwipe? – sosborn

+0

se llama al caso 'predeterminado' cuando deslizo hacia arriba o hacia abajo. –

+0

Dado que es solo una enumeración, ¿ha intentado convertir y registrar el valor del reconocedor ?: http://developer.apple.com/library/IOs/#documentation/UIKit/Reference/UISwipeGestureRecognizer_Class/Reference/Reference.html – bryanmac

Respuesta

20

La propiedad direction sólo define la permitió direcciones que son reconocidos como golpes, no la dirección real de un golpe en particular.

Lo más fácil sería utilizar dos reconocedores de gestos por separado. También puede inspeccionar la ubicación del toque cuando comienza el gesto y cuando finaliza con el método locationInView:. solución

+0

'CGPoint start = [swipeGesture locationInView: appView];' yo uso esto y esta función me da el punto de inicio del deslizamiento, pero ¿cómo lo detecto al finalizar el deslizamiento? La única forma es usar 'touchesBegan' y' touchesEnded'? –

+1

No estoy seguro si esto es realmente posible (probablemente estés mejor con dos reconocedores). Compruebe el 'estado' del reconocedor de gestos en su acción. Para la mayoría de los reconocedores de gestos, pasa de 'UIGestureRecognizerStateBegan' a' UIGestureRecognizerStateEnded', pero podría ser que el tipo de reconocedor de gestos de deslizamiento no lo haga, no lo he intentado. – omz

+1

resuelto. utilizo 'touchesBegan' y' touchesEnded'. –

11

La extensión de omz:

self.myView es la vista que quiero poner el reconocedor gesto. El código siguiente no está probado, supongo que sería mejor mantener los reconocedores como property sy agregarlos dentro del archivo viewDidLoad() o xib. self es un UIViewController.

UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipedLeft:)]; 
[swipeLeft setDirection:UISwipeGestureRecognizerDirectionLeft ]; 
[self.view addGestureRecognizer:swipeLeft]; 

UISwipeGestureRecognizer *swipeRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipedRight:)]; 
[swipeRight setDirection:UISwipeGestureRecognizerDirectionRight ]; 
[self.view addGestureRecognizer:swipeRight]; 

Añadir estos dos métodos para su UIViewController y añadir acciones necesarias:

- (IBAction)swipedRight:(UISwipeGestureRecognizer *)recognizer 
{ 
    NSLog(@"swiped right"); 
} 

- (IBAction)swipedLeft:(UISwipeGestureRecognizer *)recognizer 
{ 
    NSLog(@"swiped left"); 
} 
47

Aquí es un ejemplo de uno de mis proyectos: "no está funcionando"

// ... 

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

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

    UISwipeGestureRecognizer *swipeUp = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(didSwipe:)]; 
    swipeUp.direction = UISwipeGestureRecognizerDirectionUp; 
    [self.view addGestureRecognizer:swipeUp]; 

    UISwipeGestureRecognizer *swipeDown = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(didSwipe:)]; 
    swipeDown.direction = UISwipeGestureRecognizerDirectionDown; 
    [self.view addGestureRecognizer:swipeDown]; 

    // ... 

- (void)didSwipe:(UISwipeGestureRecognizer*)swipe{ 

    if (swipe.direction == UISwipeGestureRecognizerDirectionLeft) { 
     NSLog(@"Swipe Left"); 
    } else if (swipe.direction == UISwipeGestureRecognizerDirectionRight) { 
     NSLog(@"Swipe Right"); 
    } else if (swipe.direction == UISwipeGestureRecognizerDirectionUp) { 
     NSLog(@"Swipe Up"); 
    } else if (swipe.direction == UISwipeGestureRecognizerDirectionDown) { 
     NSLog(@"Swipe Down"); 
    } 
} 
+0

Funciona para mí la solución perfecta –

+0

Creo que no necesita agregar 4 reconocedores de gestos, solo agregue uno y en el método didSwipe compruebe la dirección del deslizador del remitente, eso debería hacerlo –

Cuestiones relacionadas