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
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];
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
}
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
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;
}
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
.
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!
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 (_ :)))
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