ios objective-c uigesturerecognizer

ios - ¿Se puede adjuntar un UIGestureRecognizer a varias vistas?



objective-c (10)

¿Qué pasa con re escribir (recrear) tu GestureReconocer cada vez que agregues un reconocedor de gestos que apunta a la misma función? En el caso de abajo 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") }

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 view2 en view2 . Si comento la tercera línea, se reconocen los view1 en la view1 . Si tengo razón y solo puede usar un reconocedor de gestos una vez, no estoy seguro de si se trata de un error o solo necesita más documentación.


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

1) Puede agregar el Reconocedor de gestos de pulsación larga desde la Biblioteca de objetos como si agregara otros objetos como UIButtons y UILabels.

Inicialmente, lo que terminé usando fue que solo tomé una.

2) Establezca salidas de referencia a UIButton y envíe acciones con el propietario del archivo.

Nota: Si tiene varios UIButton o cualquier otro objeto, necesitará un reconocedor de gestos por separado para cada uno de ellos. Para más detalles por favor refiérase a esta pregunta mía. Error al etiquetar UIButton en Reconocimiento de gestos de pulsación larga


Lo resolví 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, establezco un UIButton igual a la vista del reconocedor de gestos y bifurco 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]; .... }


No, no debe 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 unidos a una vista

Cada reconocedor de gestos está asociado con una vista. En contraste, 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 los toques que ocurren en una vista particular, debe adjuntar el reconocedor de gestos a esa vista.

Guía de manejo de eventos para iOS - Gesture Reconocizer Apple Developer Library

Mientras que otros mencionan que podrían funcionar en algunos casos, está claramente 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.


Para Swift 3 en caso de que alguien lo requiera: Basado en la Respuesta de Bhavik Rathod 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())


Podemos hacer algo como esto, es fácil y simple.

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

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

2) ahora configura este reconocedor en vistas múltiples

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


Puedes hacerlo usando este código mis vistas, que son vistas de imagen en la 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.numberOfTapsRequired = 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; } } }


Si tienes una vista fija, te sugiero que hagas algo como esto.

[self.view1 addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapTapTap:)]]; [self.view2 addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapTapTap:)]];

de esa manera se reducirá la variable inútil múltiple


Sobrescribe la clase con '' <UIScrollViewDelegate> ''

Y usa este método en la clase .m:

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

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


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

ver

La vista a la que se encuentra el reconocedor de gestos. (solo lectura)

@property (no atómico, solo lectura) UIView * view

Discusión Usted adjunta (o agrega) un reconocedor de gestos a un objeto UIView usando el método addGestureRecognizer :.