2011-10-27 11 views
6

Duplicar posibles:
UIScrollview getting touch eventsiPhone - UIScrollView ... detectar las coordenadas de un toque

¿Es posible detectar donde en un UIScrollView el dedo ha tocado?

Quiero decir, supongo que el usuario usa su dedo de esta manera: toca y desliza, levanta el dedo y de nuevo, toca y se desplaza, etc. ¿Es posible conocer el CGPoint donde ocurrieron los toques en relación con uno mismo? ver el scroller está adentro? El desplazamiento ocupa todo el selfview.

Gracias.

Respuesta

12

Puede hacerlo con reconocedores gesto. Para detectar la ubicación solo toque usar UITapGestureRecognizer

UITapGestureRecognizer *tapRecognizer = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction:)] autorelease]; 
[myScrollView addGestureRecognizer:tapRecognizer]; 

- (void)tapAction:(UITapGestureRecognizer*)sender{ 
    CGPoint tapPoint = [sender locationInView:myScrollView]; 
    CGPoint tapPointInView = [myScrollView convertPoint:tapPoint toView:self.view]; 
} 

Para convertir ese tapPoint a self.view puede utilizar convertPoint:toView: método en la clase UIView

+0

no. tapAction solo se activa si toco y no me desplazo. Si hago lo que dije, toque, avance, levante el dedo, toque, deslice, levante el dedo, etc., nunca se detectará ningún toque. No se detecta ningún toque también si la barra de desplazamiento también se desplaza después de un deslizamiento grande. El scroller tiene que estar quieto y se debe hacer un grifo seco para que funcione. – SpaceDog

+1

Hay muchos otros reconocedores de gestos: UIPanGestureRecognizer, UIPinchGestureRecognizer, UISwipeGestureRecognizer, UIRotationGestureRecognizer. Además, puede crear un reconocedor personalizado para detectar toques muy complejos. Di el ejemplo más popular con un toque simple. – beryllium

+0

@RubberDuck ¿Has descubierto esto? Estoy en el mismo barco ... Estoy trabajando en un UICollectionView, quiero detectar si el toque del dedo está en la vista de celda –

0

Se puede encontrar la ubicación de la vista y añadir el ofset de desplazamiento a la misma. Ahora, su próximo problema es que no se llamará a -(void)touchesBegan:touches:event porque los eventos se enviarán a su vista de desplazamiento. Esto puede solucionarse subclasificando su UIScrollView y hacer que scrollview envíe los eventos táctiles al siguiente respondedor (su vista).

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    // Position of touch in view 
    UITouch *touch = [[event allTouches] anyObject]; 
    CGPoint touchPoint = [touch locationInView:self.view]; 

    // Scroll view offset 
    CGPoint offset = scrollView.contentOffset; 

    // Result 
    CGPoint scrollViewPoint = CGPointMake(touchPoint.x, touchPoint.y + offset.y); 
    NSLog(@"Touch position in scroll view: %f %f", scrollViewPoint.x, scrollViewPoint.y); 
} 
+0

no. touchesBegan se activa solo si toco y no me desplazo. Si hago lo que dije, toque, avance, levante el dedo, toque, deslice, levante el dedo, etc., nunca se detectará ningún toque. No se detecta ningún toque también si la barra de desplazamiento también se desplaza después de un deslizamiento grande. El scroller tiene que estar quieto y se debe hacer un grifo seco para que funcione. No es tan fácil como parece. – SpaceDog

Cuestiones relacionadas