¿Puedes adjuntar un UIGestureRecognizer a varias vistas?

Resuelto kubi asked hace 54 años • 13 respuestas
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapTapTap:)];
[self.view1 addGestureRecognizer:tapGesture];
[self.view2 addGestureRecognizer:tapGesture];
[tapGesture release];

view2En el código anterior solo se reconocen los toques . Si comento la tercera línea, se view1reconocen 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.

kubi avatar Jan 01 '70 08:01 kubi
Aceptado

A UIGestureRecognizerse utilizará con una sola vista. Estoy de acuerdo en que la documentación es irregular. Que UIGestureRecognizertenga una sola viewpropiedad 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:.

TomSwift avatar Apr 06 '2011 14:04 TomSwift

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];
    ....
}
kwalker avatar Oct 25 '2011 01:10 kwalker

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())
George Asda avatar Nov 03 '2016 15:11 George Asda

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.

Joseph Lord avatar Jul 07 '2015 16:07 Joseph Lord