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