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);
}
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;
}
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.
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
}
}