Quiero agregar un simple reconocimiento de gestos de deslizamiento a mi proyecto de iPhone basado en la vista. Deben reconocerse los gestos en todas las direcciones (derecha, abajo, izquierda, arriba).
Se indica en los documentos para UISwipeGestureRecognizer:
Puede especificar múltiples direcciones especificando múltiples constantes UISwipeGestureRecognizerDirection utilizando operandos bit-OR. La dirección predeterminada es UISwipeGestureRecognizerDirectionRight.
Sin embargo para mí no funciona. Cuando las cuatro direcciones son OR, solo se reconocen los deslizamientos hacia la izquierda y hacia 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.");
}
Solucioné esto agregando 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.");
}
fuente
Respuestas:
Parece que hay un error. Puede especificar las direcciones permitidas 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, aún obtiene la máscara de bits que configuró originalmente (para las direcciones permitidas).
Esto significa que las comprobaciones de la dirección real siempre fallarán cuando se permita más de 1 dirección. Puede verlo usted mismo con bastante facilidad cuando genera 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 según lo 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 deslizamiento establecidas a izquierda y derecha)
Esto significa que la solución original es la forma en que se supone que debe usarse. La propiedad de dirección solo se puede usar para que los gestos se reconozcan correctamente, pero no en el método realizado en un reconocimiento exitoso para comparar la dirección real que activó el reconocimiento.
fuente
Noté que los gestos izquierda / derecha y arriba / abajo funcionan juntos en pares, por lo que solo necesita especificar dos reconocedores de gestos. Y los documentos parecen estar equivocados.
fuente
Bueno, eso apesta, resolví el problema agregando 2 gestos como mencionó Lars y eso funcionó perfectamente ...
1) Izquierda / Derecha 2) Arriba / Abajo
fuente
Ahora esta es la función didSwipe
fuente
Si usa Xcode 4.2, puede agregar Gesture Recognizers @ al guión gráfico y luego vincular los GUI Gesture Recognizers a IBActions.
Puede encontrar los reconocedores de gestos en la biblioteca de objetos del panel de utilidades (la parte inferior del panel derecho).
Entonces es solo una cuestión de Control-arrastrar a la acción apropiada.
fuente
Si desea que detecte las cuatro direcciones, deberá crear cuatro instancias, como lo hizo en su solución.
He aquí por qué : la misma instancia de UISwipeGestureRecognizer que crea es la instancia que se pasa al selector como remitente. Entonces, si lo configura para reconocer las cuatro direcciones, volverá verdadero para
sgr.direction == xxx
donde xxx es cualquiera de las cuatro direcciones.Aquí hay una solución alternativa que implica menos código (supone el uso de ARC):
fuente
Aquí hay un ejemplo de código para el uso de UISwipeGestureRecognizer. Tenga en cuenta los comentarios.
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:
fuente
fuente
Swift 2.1
Tuve que usar lo siguiente
fuente
hmm, extraño, funciona perfecto para mí, hago exactamente lo mismo
creo que deberías intentar mirar
Método UIGestureRecognizerDelegate
en los registros debes ver algo como:
debería comenzar a gesticular; target = <(action = actionForUpDownSwipeGestureRecognizer :, target =)>; dirección = arriba, abajo, izquierda, derecha>
fuente
use esto, debería ser la operación de bits
fuente
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 múltiples swipeGestureRecognizers. Si solo los nombra de manera diferente, por ejemplo handleLeftSwipeFrom y handleRightSwipeFrom, todo funciona.
fuente