web-dev-qa-db-fra.com

L'interception des mouvements de panoramique sur un UIScrollView interrompt le défilement

J'ai un UIScrollView à défilement vertical. Je veux également gérer les panoramiques horizontaux dessus, tout en autorisant le comportement de défilement vertical par défaut. J'ai mis un UIView transparent sur la vue de défilement et y ai ajouté un identificateur de mouvement panoramique. De cette façon, je peux très bien obtenir les panoramiques, mais la vue de défilement ne reçoit aucun geste.

J'ai implémenté les méthodes UIPanGestureRecognizerDelegate suivantes, dans l'espoir de limiter ma reconnaissance des gestes aux panoramiques horizontaux uniquement, mais cela n'a pas aidé:

- (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);
}
40
Macondo2Seattle

OK, je l'ai compris. Je devais faire 2 choses pour que cela fonctionne:

1) Attachez ma propre reconnaissance de panoramique à la vue de défilement elle-même, pas à une autre vue au-dessus.

2) Cette méthode UIGestureRecognizerDelegate empêche le comportement maladroit qui se produit lorsque la vue de défilement par défaut et la mienne sont appelées simultanément.

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    return YES;
}
44
Macondo2Seattle

J'ai eu le même problème à résoudre et je l'ai fait:

1) Attachez ma propre reconnaissance de panoramique à la vue de défilement.

2) Retournez OUI sur: - gestureRecognizer: shouldRecognizeSimultaneousWithGestureRecognizer:

Cela permettra aux deux gestes de fonctionner. Donc, cela signifie que lors du défilement vertical, votre délégué panGesture et votre délégué scrollView seront tous deux déclenchés. S'il s'agit d'un défilement horizontal, il n'appellera que votre délégué panGesture.

3) dans mon délégué panGesture, détectez s'il s'agit d'un défilement horizontal, sinon, ignorez.

14
tony.tc.leung

Réponse rapide:

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
    }
}
3
bnussey