¿Puedes adjuntar un UIGestureRecognizer a varias vistas?
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapTapTap:)];
[self.view1 addGestureRecognizer:tapGesture];
[self.view2 addGestureRecognizer:tapGesture];
[tapGesture release];
view2
En el código anterior solo se reconocen los toques . Si comento la tercera línea, se view1
reconocen los toques. Si estoy en lo cierto y solo puedes usar un reconocedor de gestos una vez, no estoy seguro de si se trata de un error o simplemente necesita más documentación.
A UIGestureRecognizer
se utilizará con una sola vista. Estoy de acuerdo en que la documentación es irregular. Que UIGestureRecognizer
tenga una sola view
propiedad lo delata:
vista
La vista a la que está adjunto el reconocedor de gestos. (solo lectura)
@property(noatómico, solo lectura) UIView *vista
Discusión Usted adjunta (o agrega) un reconocedor de gestos a un objeto UIView usando el método addGestureRecognizer:.
Lo solucioné usando lo siguiente.
for (UIButton *aButton in myButtons) {
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)];
longPress.minimumPressDuration=1.0;
[aButton addGestureRecognizer:longPress];
[longPress release];
}
Luego, en mi método handleLongPress, simplemente configuro un UIButton igual a la vista del reconocedor de gestos y ramifico lo que hago en función de ese botón.
- (void)handleLongPress:(UILongPressGestureRecognizer*)gesture {
if ( gesture.state == UIGestureRecognizerStateEnded ) {
UIButton *whichButton=(UIButton *)[gesture view];
selectedButton=(UIButton *)[gesture view];
....
}
Para Swift 3, en caso de que alguien requiera esto: Basado en la respuesta anterior de Bhavik Rathod.
func setGestureRecognizer() -> UIPanGestureRecognizer {
var panRecognizer = UIPanGestureRecognizer()
panRecognizer = UIPanGestureRecognizer (target: self, action: #selector(pan(panGesture:)))
panRecognizer.minimumNumberOfTouches = 1
panRecognizer.maximumNumberOfTouches = 1
return panRecognizer
}
///set the recognize in multiple views
view1.addGestureRecognizer(setGestureRecognizer())
view2.addGestureRecognizer(setGestureRecognizer())
No, no debes adjuntar reconocedores de gestos a más de una vista.
Hay esta información explícita en la documentación de Apple:
Los reconocedores de gestos están adjuntos a una vista
Cada reconocedor de gestos está asociado con una vista. Por el contrario, una vista puede tener múltiples reconocedores de gestos, porque una sola vista puede responder a muchos gestos diferentes. Para que un reconocedor de gestos reconozca toques que ocurren en una vista particular, debe adjuntar el reconocedor de gestos a esa vista.
Guía de manejo de eventos para iOS: reconocedores de gestos Biblioteca para desarrolladores de Apple
Si bien, como otros mencionan, podrían funcionar en algunos casos, claramente va en contra de la documentación y podría cambiar en cualquier versión futura de iOS.
Lo que puede hacer es agregar reconocedores de gestos separados a las vistas que desea monitorear y pueden compartir una acción común.