recognizer iphone cocoa-touch uibutton uigesturerecognizer

iphone - tap gesture recognizer xamarin forms



Cómo cancelar UIGestureRecognizer si se presiona el botón de subvista (3)

Estoy luchando para obtener el comportamiento que me gustaría de los reconocedores de gestos, específicamente cancelando ciertos gestos si otros han disparado.

Tengo un scrollView configurado para paginación y múltiples subvistas en cada página. He agregado un reconocedor de gestos táctiles para desplazarse a la página siguiente o anterior si el usuario toca a la derecha oa la izquierda de la página.

// Add a gesture recogniser turn pages on a single tap at the edge of a page UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGestureHandler:)]; tapGesture.cancelsTouchesInView = NO; [self addGestureRecognizer:tapGesture]; [tapGesture release];

y mi gestor de gestos:

- (void) tapGestureHandler:(UIGestureRecognizer *) gestureRecognizer { const CGFloat kTapMargin = 180; // Get the position of the point tapped in the window co-ordinate system CGPoint tapPoint = [gestureRecognizer locationInView:nil]; // If the tap point is to the left of the page then go back a page if (tapPoint.x > (self.frame.size.width - kTapMargin)) [self scrollRectToVisible:pageViewRightFrame animated:YES]; // If the tap point is to the right of the page then go forward a page else if (tapPoint.x < kTapMargin) [self scrollRectToVisible:pageViewLeftFrame animated:YES]; }

Todo funciona bien, excepto cuando tengo una subvista en la página que tiene botones. Quiero poder ignorar el toque para pasar la página si el usuario toca un botón en el subView y no puedo encontrar la manera de hacerlo.

Aclamaciones

Dave


Puede subclasificar UIView y sobrescribir el selector -touchesBegan , o puede jugar con la propiedad opaque de las subvistas para hacerlas "invisibles" a los toques (si view.opaque = NO, la vista ignora los eventos táctiles).


La solución que mejor funcionó para mí al final fue usar el hitTest para determinar si había botones debajo de la ubicación del gesto de tap. Si hay, entonces simplemente ignore el resto del código de gesto.

Parece que funciona bien. Me gustaría saber si hay algún problema con lo que he hecho.

- (void) tapGestureHandler:(UIGestureRecognizer *) gestureRecognizer { const CGFloat kTapMargin = 180; // Get the position of the point tapped in the window co-ordinate system CGPoint tapPoint = [gestureRecognizer locationInView:nil]; // If there are no buttons beneath this tap then move to the next page if near the page edge UIView *viewAtBottomOfHeirachy = [self.window hitTest:tapPoint withEvent:nil]; if (![viewAtBottomOfHeirachy isKindOfClass:[UIButton class]]) { // If the tap point is to the left of the page then go back a page if (tapPoint.x > (self.bounds.size.width - kTapMargin)) [self scrollRectToVisible:pageViewRightFrame animated:YES]; // If the tap point is to the right of the page then go forward a page else if (tapPoint.x < kTapMargin) [self scrollRectToVisible:pageViewLeftFrame animated:YES]; } }


La documentación de Apple muestra la respuesta:

- (void)viewDidLoad { [super viewDidLoad]; // Add the delegate to the tap gesture recognizer self.tapGestureRecognizer.delegate = self; } // Implement the UIGestureRecognizerDelegate method -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch: (UITouch *)touch { // Determine if the touch is inside the custom subview if ([touch view] == self.customSubview){ // If it is, prevent all of the delegate''s gesture recognizers // from receiving the touch return NO; } return YES; }

Por supuesto, en este caso, CustomSubview sería una subvista en la página que tiene botones (o incluso los botones)