¿Puede 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]; 

En el código anterior solo se reconocen las tomas en la view2 . Si comento la tercera línea, a continuación, los view1 en view1 son reconocidos. Si tengo razón y solo puedes usar un reconocimiento de gestos una vez, no estoy seguro de si se trata de un error o simplemente necesita más documentation.

Solutions Collecting From Web of "¿Puede adjuntar un UIGestureRecognizer a varias vistas?"

Un UIGestureRecognizer se usará con una sola vista. Estoy de acuerdo en que la documentation es irregular. Que UIGestureRecognizer tiene una propiedad de view única lo regala:

ver

La vista al que se adjunta el reconocedor de gestos. (solo lectura)

@property (nonatomic, readonly) UIView * view

Discusión Adjunta (o agrega) un reconocedor de gestos a un object UIView utilizando el método addGestureRecognizer:

Lo solucioné usando el 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 configuré un UIB con el mismo valor que la vista del gestor de reconocimiento y bifurco lo que hago en function de ese button

 - (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 lo requiera: Basado en Bhavik Rathod Respuesta anterior.

  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 debe adjuntar reconocedores de gestos a más de una vista.

Hay esta información explícita en la documentation de Apple:

Los reconocedores de gestos se adjuntan a una vista

Cada reconocimiento de gestos está asociado con una vista. Por el contrario, una vista puede tener múltiples reconocedores de gestos, ya que una sola vista puede responder a muchos gestos diferentes. Para que un reconocedor de gestos reconozca los toques que se producen en una vista particular, debe adjuntar el reconocedor de gestos a esa vista.

Guía de gestión de events para iOS: gestores de reconocimiento Biblioteca de desarrolladores de Apple

Mientras que otros mencionan que podrían funcionar en algunos casos, está claramente en contra de la documentation y podría cambiar en cualquier futura versión de iOS.

Lo que puede hacer es agregar reconocedores de gestos separados a las vistas que desea supervisar y pueden compartir una acción común.

Podemos hacer algo así, es fácil y simple

1) cree la function como se muestra a continuación en su controller (esta function devolverá GestureRecognizer)

 -(UITapGestureRecognizer*)setRecognizer{ UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(openProfile)]; [gestureRecognizer setNumberOfTapsRequinetworking:1]; return gestureRecognizer; } 

2) ahora establece este reconocedor en varias vistas

 [self.view1 addGestureRecognizer:[self setRecognizer]]; [self.view2 addGestureRecognizer:[self setRecognizer]]; 

Bueno, si alguien no quiere codificar para agregar vista de gestos para varios botones como Kwalker ha respondido anteriormente, y quiere hacerlo a través de Interface Builder esto puede ayudarlo.

1) Puede agregar Recognizer Gesto de larga pulsación desde la Biblioteca de objects como si agregara otros objects como UIButtons y UILabels.

introduzca la descripción de la imagen aquí Inicialmente, lo que terminé usando fue que tomé solo uno

2) Establezca salidas de reference en el UIButton y envíe acciones con el propietario del file.

introduzca la descripción de la imagen aquí

Nota: Si tiene varios botones UIB o cualquier otro object necesitará un gestor de reconocimiento separado para cada uno de ellos. Para más detalles, consulte esta pregunta mía. Obtención incorrecta de la label de UIB en el reconocimiento de gestos de pulsación prolongada

Reemplazar class por ' <UIScrollViewDelegate> '

Y use este método en la class .m:

 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{ return YES; } 

Este método lo ayudará a habilitar el desplazamiento múltiple en una sola vista.

¿Qué hay de volver a escribir (volver a crear) su GestureRecognize cada vez que agrega un gestor de reconocimiento apuntando a la misma function. En el siguiente caso funciona. Estoy usando IBOutletCollection

Swift 2:

 @IBOutlet var topicView: [UIView]! override func viewDidLoad() { for view in self.topicView as [UIView] { view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "viewClicked:")) } } func viewClicked(recognizer: UITapGestureRecognizer) { print("tap") } 

Puedes hacerlo usando este código mis vistas que son vistas de imágenes en el xib.

 - (void)viewDidLoad { firstIV.tag = 501; secondIV.tag = 502; thirdIV.tag = 503; forthIV.tag = 504; [self addTapGesturetoImageView: firstIV]; [self addTapGesturetoImageView: secondIV]; [self addTapGesturetoImageView: thirdIV]; [self addTapGesturetoImageView: forthIV]; } -(void)addTapGesturetoImageView:(UIImageView*)iv { iv.userInteractionEnabled = YES; UITapGestureRecognizer * textfielBGIVTapGasture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(textfielBGIVTapped:)]; textfielBGIVTapGasture.numberOfTapsRequinetworking = 1; [iv addGestureRecognizer:textfielBGIVTapGasture]; } - (void)textfielBGIVTapped:(UITapGestureRecognizer *)recognizer { int tag = recognizer.view.tag-500; switch (tag) { case 1: { //firstIV tapped; break; } case 2: { //secondIV tapped; break; } case 3: { //thirdIV tapped; break; } case 4: { //forthIV tapped; break; } default: { break; } } }