web-dev-qa-db-fra.com

Reconnaissance de gestes ScrollView mangeant tous les événements tactiles

J'ai un UIScrollView auquel j'ai ajouté un reconnaisseur de gestes à simple pression pour afficher/masquer une superposition d'interface utilisateur en utilisant:

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
[scrollView addGestureRecognizer:singleTap];

et:

- (void)handleTap:(UITapGestureRecognizer *)sender {
    // report click to UI changer
}

J'ai ajouté un affichage facile du tablea au bas du UIScrollView. Tout fonctionne correctement (défilement horizontal et vertical), mais le problème est que les tapotements ne sont reconnus que par la reconnaissance des gestes (ci-dessus), mais pas par la vue de table facile. Si je supprime la ligne qui enregistre l'auditeur de gestes, tout fonctionne bien, la vue tableau remarque les tapotements sur elle-même.

C'est comme si la fonction de reconnaissance de gestes "mangeait" les événements de tapotement sur la vue de table et ne les propageait pas vers le bas.

Toute aide est appréciée

39
Itai Hanski

Cela devrait résoudre votre problème.
Détecter l'événement tactile sur UIScrollView ET sur les composants d'UIView [qui est placé dans UIScrollView]
L'idée est de dire au reconnaisseur de gestes de ne pas engloutir les événements tactiles. Pour ce faire, vous devez définir la propriété cancelsTouchesInView de singleTap sur NO, qui est YES par défaut.

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
singleTap.cancelsTouchesInView = NO;
[scrollView addGestureRecognizer:singleTap]; 
76
zambrey

Swift 3.

 let singleTap = UITapGestureRecognizer(target: self, action: #selector(handleTap(_:)))
 singleTap.cancelsTouchesInView = false
 singleTap.numberOfTapsRequired = 1
 scrollView.addGestureRecognizer(singleTap)

Et la méthode du sélecteur est comme.

@objc func handleTap(_ recognizer: UITapGestureRecognizer) {
  // Perform operation
}
12
Jaydeep

Je pense que la raison en est que User Interaction Enabled est défini sur false pour UIImageView. Vous devez le définir sur true pour activer le tapotement dessus

6
RandyTek

Vous pouvez définir quels objets doivent être inclus/exclus pour les touches.

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gesture shouldReceiveTouch:(UITouch *)touch {            
   if (touch.view == [self view]) {
       return YES;
   }
   return NO;
}
6
sangony

Merci @zambrey

Version Swift 2.2+:

scrollView.delegate = self

let allowMultipleTouches = UITapGestureRecognizer(target: self, action: #selector(genderPressed))
allowMultipleTouches.numberOfTapsRequired = 1
allowMultipleTouches.cancelsTouchesInView = false

scrollView.addGestureRecognizer(allowMultipleTouches)

Si votre vue de défilement est dans le Storyboard, n'oubliez pas d'épingler la prise dans le contrôleur de vue. Dans cet exemple, scrollView est la sortie de UIScrollView.

2
Nuno Vieira

Cela a fonctionné pour moi dans Swift 3/Xcode 8

self.scrollView.touchesShouldCancel(in: ** the view you want the touches in **)
self.scrollView.canCancelContentTouches = false

Bonne chance!

2
hamishkeith

Vous pouvez capturer tout type de gestes dans UIscrollView. Assurez-vous de gérer également certaines des propriétés par défaut ainsi que de définir la propriété cancelsTouchesInView sur false, c'est vrai par défaut. Donnez également quelques balises nos à vos sous-vues pour les distinguer dans les sélecteurs. & permettent également à leur interaction utilisateur de se réaliser.

let tap = UITapGestureRecognizer (cible: auto, action:

sélecteur (didTapByUser (_ :)))

1
Aks

TapGestures a fonctionné pour moi. Le glissement d'autre part, j'ai dû désactiver le défilement et cela a fonctionné.

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
1
Maria