Interceptar gestos de panorámica sobre un UIScrollView interrumpe el desplazamiento


Tengo un desplazamiento vertical UIScrollView. También quiero manejar las cacerolas horizontales en él, mientras que permite el comportamiento de desplazamiento vertical predeterminado. He puesto un UIView transparente sobre la vista de desplazamiento y le he añadido un reconocedor de gestos de panorámica. De esta manera puedo obtener las cacerolas muy bien, pero luego la vista de desplazamiento no recibe ningún gesto.

He implementado los siguientes métodos UIPanGestureRecognizerDelegate, con la esperanza de limitar mi reconocedor de gestos solo a cacerolas horizontales, pero eso no ayudó:

- (BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer *)gestureRecognizer {
    // Only accept horizontal pans here.
    // Leave the vertical pans for scrolling the content.
    CGPoint translation = [gestureRecognizer translationInView:self.view];
    BOOL isHorizontalPan = (fabsf(translation.x) > fabsf(translation.y));
    return  isHorizontalPan;
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    return (otherGestureRecognizer == _scrollView.panGestureRecognizer);
}
Author: Macondo2Seattle, 2012-12-06

3 answers

OK, lo descubrí. Necesitaba hacer 2 cosas para que esto funcionara:

1) Adjunte mi propio reconocedor de panorámica a la vista de desplazamiento en sí, no a otra vista encima de ella.

2) Este método UIGestureRecognizerDelegate evita el comportamiento tonto que ocurre cuando tanto la vista de desplazamiento predeterminada como la mía se invocan simultáneamente.

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    return YES;
}
 36
Author: Macondo2Seattle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-22 18:49:27

Tenía que resolver el mismo problema e hice esto:

1) Adjuntar mi propio reconocedor de panorámica a la vista de desplazamiento.

2) Retorno SÍ el: - gestureRecognizer: shouldRecognizeSimultaneouslyWithGestureRecognizer:

Esto permitirá que ambos gestos funcionen. Lo que eso significa es que en desplazamiento vertical, tanto su delegado panGesture como el Delegado ScrollView serán despedidos. Si es un pergamino horizontal, solo llamará a tu delegado de dolor.

3) en mi dolor delegar, detectar si es un desplazamiento horizontal, si no lo es, ignorar.

 12
Author: tony.tc.leung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-12 21:12:41

Respuesta rápida:

let scrollViewPanGesture = UIPanGestureRecognizer(target: self, action: #selector(onPan(_:)))
scrollViewPanGesture.delegate = self
scrollView.addGestureRecognizer(scrollViewPanGesture)

extension ViewController: UIGestureRecognizerDelegate {
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        return true
    }
}
 1
Author: bnussey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-08 00:21:34