ios - recognizer - ScrollView reconocedor de gestos comiendo todos los eventos táctiles
tapgesture recognizer swift (8)
Tengo un UIScrollView
al que agregué un único reconocedor de gestos de toque para mostrar u ocultar la superposición de UI usando:
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
[scrollView addGestureRecognizer:singleTap];
y:
- (void)handleTap:(UITapGestureRecognizer *)sender {
// report click to UI changer
}
Agregué una vista de tabla fácil a la parte inferior de UIScrollView
. Todo funciona bien (desplazándose tanto horizontal como verticalmente), pero el problema es que los toques son reconocidos solo por el reconocedor de gestos (arriba), pero no por la vista de tabla fácil. Si elimino la línea que registra el oyente de gestos, todo funciona bien, la vista de tabla se da cuenta de los toques en sí misma.
Es como si la función del reconocedor de gestos "come" los eventos tap en la vista de tabla y no los propaga hacia abajo.
Cualquier ayuda es apreciada
Creo que la razón es que User Interaction Enabled
está configurado en false
para UIImageView. Debes configurarlo en verdadero para habilitar tocarlo
Esto debería solucionar tu problema.
Detecta evento táctil en UIScrollView AND en los componentes de UIView [que se coloca dentro de UIScrollView]
La idea es decirle al reconocedor de gestos que no se trague los eventos táctiles. Para hacer esto, debe establecer la propiedad cancelsTouchesInView de cancelsTouchesInView
en NO
, que es YES
de forma predeterminada.
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
singleTap.cancelsTouchesInView = NO;
[scrollView addGestureRecognizer:singleTap];
Esto funcionó para mí en Swift 3 / Xcode 8
self.scrollView.touchesShouldCancel(in: ** the view you want the touches in **)
self.scrollView.canCancelContentTouches = false
¡Buena suerte!
Gracias @zambrey
Versión Swift 2.2+:
scrollView.delegate = self
let allowMultipleTouches = UITapGestureRecognizer(target: self, action: #selector(genderPressed))
allowMultipleTouches.numberOfTapsRequired = 1
allowMultipleTouches.cancelsTouchesInView = false
scrollView.addGestureRecognizer(allowMultipleTouches)
Si su vista de desplazamiento está en el guión gráfico, no se olvide de fijar el Outlet en el controlador de vista. En este ejemplo, scrollView
es el Outlet de UIScrollView
.
Puede capturar cualquier tipo de gestos en UIscrollView. Asegúrese de que también maneja algunas de las propiedades predeterminadas, así como establecer la propiedad cancelsTouchesInView en false, es verdadera de manera predeterminada. También proporcione algunos nodos de etiqueta a sus vistas secundarias para distinguirlos en selectores. y también permiten que su interacción del Usuario sea verdadera.
let tap = UITapGestureRecognizer (target: self, action:
selector (didTapByUser (_ :)))
Puede establecer qué objetos se incluirán / excluirán para los toques.
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gesture shouldReceiveTouch:(UITouch *)touch {
if (touch.view == [self view]) {
return YES;
}
return NO;
}
TapGestures funcionó para mí. El deslizamiento por otro lado, tuve que deshabilitar el desplazamiento y funcionó.
swipeLeftGesture = UISwipeGestureRecognizer(target: self, action: #selector(swipeToNewImage(_:)))
swipeLeftGesture.direction = .left
scrollView.addGestureRecognizer(swipeLeftGesture)
swipeRightGesture = UISwipeGestureRecognizer(target: self, action: #selector(swipeToNewImage(_:)))
scrollView.addGestureRecognizer(swipeRightGesture)
scrollView.isScrollEnabled = false
Swift 3.0
let singleTap = UITapGestureRecognizer(target: self, action: #selector(handleTap(_:)))
singleTap.cancelsTouchesInView = false
singleTap.numberOfTapsRequired = 1
scrollView.addGestureRecognizer(singleTap)
Y el método del selector sea como.
func handleTap(_ recognizer: UITapGestureRecognizer) {
// Perform operation
}