2012-01-18 14 views
22

Tengo un UIView en el que agregué un UITapGestureRecognizer. Dentro de esa vista también tengo una subvista en la que básicamente es una especie de UITableView. La pregunta es por qué el UITableView no reconoce el toque en una fila, sino que va al manejador del reconocedor de gestos táctiles todo el tiempo. ¿Por qué es esto y cómo lo resuelvo? Si configuro el número de tomas en 2, entonces funciona bien. Alguna idea sobre como resolver esto? Básicamente no llama al didSelectRowAtIndexPath.Conflicto UITapGestureRecognizer en UIView y para UITableView

Respuesta

54

Conjunto cancelsTouchesInView de su reconocedor a NO. De lo contrario, "consume" el toque por sí mismo y no lo transfiere a la vista de tabla. Es por eso que el evento de selección nunca ocurre.

+4

[Al establecer este valor en 'NO 'se indica al reconocedor que entregue todos los toques a la vista subyacente, incluso cuando haya reconocido la secuencia.] (Http://developer.apple.com/library/IOs/#documentation/ UIKit/Reference/UIGestureRecognizer_Class/Reference/Reference.html) – dasblinkenlight

+1

código de ejemplo 'longPressGestureRecognizer.cancelsTouchesInView = NO;' (gracias dasblinkenlight) – tmr

+0

@dasblinkenlight aún no funciona para mí, no puedo realizar los eventos táctiles en mi celda de vista de tabla, no puedo seleccionar los elementos de la celda de vista de tabla, he usado 'tableView de mesa (_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 'pero los elementos no se están seleccionando –

26

Si desea tanto su UITableViewy su UITapGestureRecognizer para recibir eventos de toque, entonces sí la cancelsTouchesInView = NO va a funcionar. Si desea que el reconocedor de gestos de toque no reciba los eventos táctiles destinados a la vista de tabla, es un poco menos fácil pero muy factible.

Básicamente cuando está creando su reconocedor de gestos se configura como su delegado. Luego implementa el método de delegado gestureRecognizer:shouldReceiveTouch:. Una implementación básica podría verse así.

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{ 
    UITableView *tableView = self.tableView; 
    CGPoint touchPoint = [touch locationInView:tableView]; 
    return ![tableView hitTest:touchPoint withEvent:nil]; 
} 

En esencia, este método (tal como se aplica) pide al tableView si la ubicación de este toque cae dentro de la jurisdicción del tableView 's, y si lo hace, se bloqueará el reconocedor gesto de recibir el toque ... permitiendo que el tableView para recibir el toque

+1

¿No podríamos simplificar esto cambiando las líneas 3 y 4 a:' CGRect frame = self.tableView.frame; return! CGRectContainsPoint (frame, location); '? – Aufwind

+0

@Aufwind Gracias por señalar mi código de cálculo excesivamente complejo. Debo haber precipitado esta respuesta demasiado. 'CGRectContainsPoint()' es ciertamente una forma mucho mejor de manejar este cálculo que el que originalmente elegí. Sin embargo, he editado mi respuesta para usar 'hitTest: withEvent:'. Cuál sería mi método preferido por algunas razones. Una de las cuales sería una vista de forma irregular. Si una vista se presentó con forma irregular (por ejemplo, un círculo que solo maneja toques en el área del círculo). Este caso no sería manejado adecuadamente por los cálculos manuales que estaba realizando. Gracias de nuevo. – NJones

+0

De nada. :-) – Aufwind

Cuestiones relacionadas