una saber puedo pantalla olvide hacer cómo cuál cuenta como captura apple activar iphone objective-c ipad uigesturerecognizer uiswipegesturerecognizer

saber - screenshot iphone 5s



Cómo reconocer el deslizamiento en las 4 direcciones? (8)

De hecho, me encontré con este problema exacto antes. Lo que terminé haciendo fue crear una subclase UIView, anulando touchesMoved: y haciendo algunas matemáticas para calcular la dirección.

Aquí está la idea general:

#import "OmnidirectionalControl.h" typedef NS_ENUM(NSInteger, direction) { Down = 0, DownRight = 1, Right = 2, UpRight = 3, Up = 4, UpLeft = 5, Left = 6, DownLeft = 7 }; @interface OmnidirectionalControl () @property (nonatomic) CGPoint startTouch; @property (nonatomic) CGPoint endTouch; @end -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { self.startTouch = [[touches allObjects][0] locationInView:self]; } -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { self.lastTouch = [[[touches allObjects] lastObject] locationInView:self]; NSLog(@"Direction: %d", [self calculateDirectionFromTouches]); } -(direction)calculateDirectionFromTouches { NSInteger xDisplacement = self.lastTouch.x-self.startTouch.x; NSInteger yDisplacement = self.lastTouch.y-self.startTouch.y; float angle = atan2(xDisplacement, yDisplacement); int octant = (int)(round(8 * angle / (2 * M_PI) + 8)) % 8; return (direction) octant; }

Por simplicidad en touchesMoved: solo registro la dirección, pero puede hacer lo que quiera con esa información (por ejemplo, pasarla a un delegado, publicar una notificación con ella, etc.). En touchesMoved también necesitarás algún método para reconocer si el deslizamiento está terminado o no, pero eso no es del todo relevante para la pregunta, así que te lo dejo. La matemática en calculateDirectionFromTouches se explica here .

Necesito reconocer golpes en todas las direcciones ( Arriba / Abajo / Izquierda / Derecha ). No al mismo tiempo, pero necesito reconocerlos.

Lo intenté:

UISwipeGestureRecognizer *Swipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(SwipeRecognizer:)]; Swipe.direction = (UISwipeGestureRecognizerDirectionLeft | UISwipeGestureRecognizerDirectionRight | UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionUp); [self.view addGestureRecognizer:Swipe]; [Swipe release];

pero no apareció nada en SwipeRecognizer

Aquí está el código para SwipeRecognizer:

- (void) SwipeRecognizer:(UISwipeGestureRecognizer *)sender { if ( sender.direction == UISwipeGestureRecognizerDirectionLeft ) NSLog(@" *** SWIPE LEFT ***"); if ( sender.direction == UISwipeGestureRecognizerDirectionRight ) NSLog(@" *** SWIPE RIGHT ***"); if ( sender.direction == UISwipeGestureRecognizerDirectionDown ) NSLog(@" *** SWIPE DOWN ***"); if ( sender.direction == UISwipeGestureRecognizerDirectionUp ) NSLog(@" *** SWIPE UP ***"); }

¿Cómo puedo hacer esto? ¿Cómo puedo asignar a mi objeto Swipe todas las direcciones diferentes?


Estableces la dirección de esta manera

UISwipeGestureRecognizer *Swipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(SwipeRecognizer:)]; Swipe.direction = (UISwipeGestureRecognizerDirectionLeft | UISwipeGestureRecognizerDirectionRight | UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionUp);

Esa es la dirección en la que recibirás la devolución de llamada, por lo que es normal que todas tus pruebas fallen. Si tuvieras

- (void) SwipeRecognizer:(UISwipeGestureRecognizer *)sender { if ( sender.direction | UISwipeGestureRecognizerDirectionLeft ) NSLog(@" *** SWIPE LEFT ***"); if ( sender.direction | UISwipeGestureRecognizerDirectionRight ) NSLog(@" *** SWIPE RIGHT ***"); if ( sender.direction | UISwipeGestureRecognizerDirectionDown ) NSLog(@" *** SWIPE DOWN ***"); if ( sender.direction | UISwipeGestureRecognizerDirectionUp ) NSLog(@" *** SWIPE UP ***"); }

Las pruebas tendrían éxito (pero todas tendrían éxito, por lo que no obtendría ninguna información de ellas). Si desea distinguir entre golpes en diferentes direcciones, necesitará identificadores de gestos por separado.

EDITAR

Como se señaló en los comentarios, vea esta respuesta . Aparentemente incluso esto no funciona. Debes crear deslizar con solo una dirección para hacerte la vida más fácil.


Finalmente encontré la respuesta más simple, marque esta como la respuesta si está de acuerdo.

Si solo tiene un deslizamiento de una dirección + panorámica, solo diga: [myPanRecogznier requireGestureRecognizerToFail: mySwipeRecognizer];

Pero si tiene dos o más golpes, no puede pasar una matriz en ese método. Para eso, hay UIGestureRecognizerDelegate que necesita implementar.

Por ejemplo, si desea reconocer 2 deslizamientos (izquierdo y derecho) y también desea permitir que el usuario realice una panorámica, defina los reconocedores de gestos como propiedades o variables de instancia, y luego configure su CV como delegado en la bandeja. Reconocedor de gestos:

_swipeLeft = [[UISwipeGestureRecognizer alloc] ...]; // use proper init here _swipeRight = [[UISwipeGestureRecognizer alloc] ...]; // user proper init here _swipeLeft.direction = UISwipeGestureRecognizerDirectionLeft; _swipeRight.direction = UISwipeGestureRecognizerDirectionRight; _pan = [[UIPanGestureRecognizer alloc] ...]; // use proper init here _pan.delegate = self; // then add recognizers to your view

A continuación, implementa - (BOOL) gestureRecognizer: (UIGestureRecognizer *) gestureRecognizer shouldRequireFailureOfGestureRecognizer: (UIGestureRecognizer *) método de delegado otherGestureRecognizer, así:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { if (gestureRecognizer == _pan && (otherGestureRecognizer == _swipeLeft || otherGestureRecognizer == _swipeRight)) { return YES; } return NO; }

Esto le dice al reconocedor de gestos pan que solo funciona si no se reconocen los golpes izquierdos y derechos, ¡perfecto!

Esperemos que en el futuro, Apple nos deje pasar una matriz al método requireGestureRecognizerToFail:


Lamentablemente, no puede usar la propiedad de direction para escuchar el reconocedor; solo le da las direcciones detectadas por el reconocedor. He utilizado dos UISwipeGestureRecognizer diferentes para ese propósito, vea mi respuesta aquí: https://.com/a/16810160/936957


Puede agregar solo una diagonal con SwipeGesture, luego ...

UISwipeGestureRecognizer *swipeV = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(action)]; UISwipeGestureRecognizer *swipeH = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(action)]; swipeH.direction = ( UISwipeGestureRecognizerDirectionLeft | UISwipeGestureRecognizerDirectionRight ); swipeV.direction = ( UISwipeGestureRecognizerDirectionUp | UISwipeGestureRecognizerDirectionDown ); [self addGestureRecognizer:swipeH]; [self addGestureRecognizer:swipeV]; self.userInteractionEnabled = YES;


Puede que no sea la mejor solución, pero siempre puedes especificar diferentes UISwipeGestureRecognizer para cada dirección de deslizamiento que desees detectar.

En el método viewDidLoad solo defina el UISwipeGestureRecognizer requerido:

- (void)viewDidLoad{ UISwipeGestureRecognizer *recognizerUp = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeUp:)]; recognizerUp.direction = UISwipeGestureRecognizerDirectionUp; [[self view] addGestureRecognizer:recognizerUp]; UISwipeGestureRecognizer *recognizerDown = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeDown:)]; recognizerDown.direction = UISwipeGestureRecognizerDirectionDown; [[self view] addGestureRecognizer:recognizerDown]; }

Luego solo implemente los métodos respectivos para manejar los golpes:

- (void)handleSwipeUp:(UISwipeGestureRecognizer *)sender{ if (sender.state == UIGestureRecognizerStateEnded){ NSLog(@"SWIPE UP"); } } - (void)handleSwipeDown:(UISwipeGestureRecognizer *)sender{ if (sender.state == UIGestureRecognizerStateEnded){ NSLog(@"SWIPE DOWN"); } }


Use un UIPanGestureRecogizer y detecte las instrucciones de deslizamiento que le interesan. ver la documentación de UIPanGestureRecognizer para más detalles. -rrh

// add pan recognizer to the view when initialized UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panRecognized:)]; [panRecognizer setDelegate:self]; [self addGestureRecognizer:panRecognizer]; // add to the view you want to detect swipe on -(void)panRecognized:(UIPanGestureRecognizer *)sender { if (sender.state == UIGestureRecognizerStateBegan) { // you might want to do something at the start of the pan } CGPoint distance = [sender translationInView:self]; // get distance of pan/swipe in the view in which the gesture recognizer was added CGPoint velocity = [sender velocityInView:self]; // get velocity of pan/swipe in the view in which the gesture recognizer was added float usersSwipeSpeed = abs(velocity.x); // use this if you need to move an object at a speed that matches the users swipe speed NSLog(@"swipe speed:%f", usersSwipeSpeed); if (sender.state == UIGestureRecognizerStateEnded) { [sender cancelsTouchesInView]; // you may or may not need this - check documentation if unsure if (distance.x > 0) { // right NSLog(@"user swiped right"); } else if (distance.x < 0) { //left NSLog(@"user swiped left"); } if (distance.y > 0) { // down NSLog(@"user swiped down"); } else if (distance.y < 0) { //up NSLog(@"user swiped up"); } // Note: if you don''t want both axis directions to be triggered (i.e. up and right) you can add a tolerence instead of checking the distance against 0 you could check for greater and less than 50 or 100, etc. } }

CHANHE EN EL CÓDIGO ESTATAL CON ESTE

// si QUIERES SOLO SWIPE DESDE ARRIBA, ABAJO, IZQUIERDA Y DERECHA

if (sender.state == UIGestureRecognizerStateEnded) { [sender cancelsTouchesInView]; // you may or may not need this - check documentation if unsure if (distance.x > 0 && abs(distance.x)>abs(distance.y)) { // right NSLog(@"user swiped right"); } else if (distance.x < 0 && abs(distance.x)>abs(distance.y)) { //left NSLog(@"user swiped left"); } if (distance.y > 0 && abs(distance.y)>abs(distance.x)) { // down NSLog(@"user swiped down"); } else if (distance.y < 0 && abs(distance.y)>abs(distance.x)) { //up NSLog(@"user swiped up"); } }


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"); }