2012-06-27 8 views
16

Actualmente estoy usando un UIScrollView para trabajar como una forma de desplazar/arrastrar el cursor/marcador de un gráfico que estoy mostrando en mi aplicación. Utilizo scrollViewDidScroll, etc. para detectar la posición de contentoffset y manipular lo que visualizo en la pantalla en función de esta posición.ios ¿es posible que un uiscrollview detecte un solo toque por parte de un usuario al mismo tiempo que proporciona sus capacidades de arrastre y desplazamiento?

Mi pregunta es si también es posible detectar un solo toque de un usuario en la pantalla y obtener la posición de este tap (para establecer el contentoffset en esta posición)?

He leído algunos tutoriales que describen la creación de una subclase de uiscrollview, pero parece que estas subclases SÓLO contarán para un solo toque y no también para arrastrar/desplazarse.

¿Alguien tiene alguna idea de cómo podría detectar el toque único de un usuario en mi UIScrollView mientras todavía tiene sus capacidades de desplazamiento/arrastre?
¡Gracias de antemano!

+0

la práctica general para UIScrollViews es no meterse con las formas en que el el usuario interactúa con ellos. Apple los creó tal como son por una razón: si desea un comportamiento diferente, cree su propia vista. Aparte de eso, sin embargo, no tengo muy claro el motivo por el que quieres detectar el tap. El usuario tocaría dentro de la vista de desplazamiento y diría que establecería contentOffset en la posición de tap, pero contentOffset describe la esquina superior izquierda del contenido que se puede ver dentro de la vista de desplazamiento, así que ... ¿Qué quiere decir exactamente? – WendiKidd

+0

sí porque el contentoffset es cómo determino dónde está "la vista de desplazamiento" en la pantalla. En otras palabras, contentoffset es como un marcador de cuán abajo la vista de desplazamiento es el usuario. Entonces, cambio el texto de una etiqueta en función de la posición de scrollview aka the contentoffset._Así, quiero un toque de usuario para establecer/actualizar el contentoffset en función de donde el usuario tocó en scrollview_ –

Respuesta

30

Utilice el siguiente código para su objeto ScrollView:

UITapGestureRecognizer *singleTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTap:)]; 
singleTapGestureRecognizer.numberOfTapsRequired = 1; 
singleTapGestureRecognizer.enabled = YES; 
singleTapGestureRecognizer.cancelsTouchesInView = NO; 
[scrollView addGestureRecognizer:singleTapGestureRecognizer]; 
//[singleTapGestureRecognizer release]; Not needed in ARC-enabled Project 

}

- (void)singleTap:(UITapGestureRecognizer *)gesture { 
//handle taps 
} 
+0

jaja, esto es exactamente (bueno, casi exactamente) la solución que se me ocurrió pero gracias de todos modos !! –

+0

En realidad, necesita establecer solo cancelsTouchesInView como numberOfTapsRequired y enabled están establecidos en 1 y YES de forma predeterminada: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIGestureRecognizer_Class/ – dnlcrl

+0

Hoy en día puede crear un UITapGestureRecognizer en el guión gráfico y arrastre una acción para un código mucho más corto. –

0

¿Ha considerado adjuntar UITapGestureRecognizer a scrollView? He adjuntado un UITAPGestureRecognizer a UIScrollView y utilicé –gestureRecognizerShouldBegin: y/o –gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: para cancelar la panorámica integrada cuando se desea un toque.

1

La primera parte de la pregunta es bastante simple de poner en marcha. Si usted tiene una subclase UIScrollView, basta con añadir una anulación touchesEnded que tiene este aspecto:

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 

    if ([touch tapCount] == 1) { 

     CGPoint location = [touch locationInView:self]; 

     [self setContentOffset:location animated:YES]; 

    } 


} 

En el caso de la vista de desplazamiento, el -locationInView para el tacto en realidad ya se disponen de ContentOffset añadió en ella. Lo que hará este código es desplazarse por la vista de desplazamiento para que el punto tocado por el usuario esté en la esquina superior izquierda de la vista. Probablemente esto no es exactamente lo que quieres, así que tendrás que hacer cosas como agregar un desplazamiento si quieres que el desplazamiento termine en 10 píxeles o harías otro CGPoint con solo el valor x del ubicación si su desplazamiento no es de izquierda a derecha.

Esto no interferirá con la posibilidad de realizar el desplazamiento.

+0

esto es fantástico para momentos en que UIGestureRecognizer simplemente no funciona (la mayoría de las veces para mí parece!) –

6

Swift 3

let scrollViewTapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(scrollViewTapped(_:))) 
scrollViewTapGestureRecognizer.numberOfTapsRequired = 1 
scrollViewTapGestureRecognizer.isEnabled = true 
scrollViewTapGestureRecognizer.cancelsTouchesInView = false 
scrollView.addGestureRecognizer(scrollViewTapGestureRecognizer) 

func scrollViewTapped(_ sender: UITapGestureRecognizer) { 
    print("UIScrollView was tapped.") 
} 
Cuestiones relacionadas