iphone - ¿Es posible que un uiscrollview detecte un solo toque por parte de un usuario sin dejar de ofrecer sus capacidades de arrastre y desplazamiento?
ios touch (4)
¿Ha buscado adjuntar UITapGestureRecognizer al scrollView? He adjuntado un UITapGestureRecognizer a un UIScrollView y utilicé –gestureRecognizerShouldBegin:
y / o –gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:
para cancelar el –gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:
integrado cuando se desea un toque.
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. Uso scrollViewDidScroll, etc. para detectar la posición del conjunto de contenido y manipular lo que muestro en la pantalla en función de esta posición.
Mi pregunta es si es posible también detectar un solo toque de un usuario en la pantalla y obtener la posición de este toque (para luego establecer el límite de contenido en esta posición).
He leído algunos tutoriales que describen la creación de una subclase de un uiscrollview, pero parece que estas subclases SÓLO contarán para un solo toque y no para arrastrar / desplazar también.
¿Alguien tiene alguna idea de cómo puedo detectar un solo toque de un usuario en mi UIScrollView mientras aún tengo sus capacidades de desplazamiento / arrastre?
¡Gracias de antemano!
La primera parte de la pregunta es bastante simple para ponerse en marcha. Si tiene una subclase de UIScrollView, puede agregar una modificación de touchesEnded que se parece a esto:
-(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, la opción -locationInView for the touch ya tendrá el ContentOffset agregado en él. Lo que hará este código es desplazar la vista de desplazamiento para que el punto que tocó el usuario esté en la parte superior izquierda de la vista. Es probable que esto no sea exactamente lo que desea, por lo que tendrá que hacer cosas como agregar un desplazamiento si desea que el desplazamiento termine en 10 píxeles, o crearía otro CGPoint con solo el valor x fuera del ubicación si su desplazamiento no es de izquierda a derecha.
Esto no interferirá con la capacidad de hacer el desplazamiento.
Use 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
}
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.")
}