J'ai une hiérarchie de vues qui ressemble à ceci:
UIView (A)
UIView > UIImageView
UIView > UIView (B)
UIView > UIView (B) > Rounded Rect Button
UIView > UIView (B) > UIImageView
UIView > UIView (B) > UILabel
J'ai attaché un ou plusieurs reconnaisseurs de gestes à mon UIView (B). Le problème auquel je suis confronté est que je n'obtiens aucune action pour le bouton Rounded Rect qui se trouve à l'intérieur de l'UIView (B). Le module de reconnaissance de gestes singleTap capture / remplace l'événement Touch Up Inside du bouton.
Comment puis-je le faire fonctionner? Je pensais que la hiérarchie de la chaîne de répondeurs s'assurera que l'événement tactile de bouton aura la préférence, et il sera déclenché! Qu'est-ce que je rate?
Voici un code associé:
#pragma mark -
#pragma mark View lifecycle (Gesture recognizer setup)
- (void)viewDidLoad {
[super viewDidLoad];
// double tap gesture recognizer
UITapGestureRecognizer *dtapGestureRecognize = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTapGestureRecognizer:)];
dtapGestureRecognize.delegate = self;
dtapGestureRecognize.numberOfTapsRequired = 2;
[self.viewB addGestureRecognizer:dtapGestureRecognize];
// single tap gesture recognizer
UITapGestureRecognizer *tapGestureRecognize = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapGestureRecognizer:)];
tapGestureRecognize.delegate = self;
tapGestureRecognize.numberOfTapsRequired = 1;
[tapGestureRecognize requireGestureRecognizerToFail:dtapGestureRecognize];
[self.viewB addGestureRecognizer:tapGestureRecognize];
// add gesture recodgnizer to the grid view to start the edit mode
UILongPressGestureRecognizer *pahGestureRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressGestureRecognizerStateChanged:)];
pahGestureRecognizer.delegate = self;
pahGestureRecognizer.minimumPressDuration = 0.5;
[self.viewB addGestureRecognizer:pahGestureRecognizer];
[dtapGestureRecognize release];
[tapGestureRecognize release];
[pahGestureRecognizer release];
}
#pragma mark -
#pragma mark Button actions
- (IBAction)buttonTouchUpInside:(id)sender {
NSLog(@"%s, %@", __FUNCTION__, sender);
}
#pragma mark -
#pragma mark Gesture recognizer actions
- (void)singleTapGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer {
NSLog(@"%s", __FUNCTION__);
}
- (void)doubleTapGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer {
NSLog(@"%s", __FUNCTION__);
}
- (void)longPressGestureRecognizerStateChanged:(UIGestureRecognizer *)gestureRecognizer {
switch (gestureRecognizer.state) {
case UIGestureRecognizerStateEnded: {
NSLog(@"%s", __FUNCTION__);
break;
}
default:
break;
}
}
Réponses:
Dans la méthode "shouldReceiveTouch", vous devez ajouter une condition qui renverra NON si le toucher est dans le bouton.
Ceci provient de l' exemple Apple SimpleGestureRecognizers .
j'espère que ça aidera
Éditer
Comme Daniel l'a noté, vous devez vous y conformer pour
UIGestureRecognizerDelegate
que cela fonctionne.Shani
la source
if ( [touch.view isKindOfClass:[UIControl class]] || [[touch.view superview] isKindOfClass:[UITableViewCell class]] ) {
... Notez que les cellules tableview sont "touchées" dans leur contentView, qui est membre d'une classe privée, donc là nous vérifions la classe de superview à la place.J'ai aussi eu le même problème, puis j'ai essayé avec
Cela fonctionne maintenant parfaitement .........
la source
myGestureRecognizer.delegate = self;
De manière générale, nous utilisons la méthode déléguée ci-dessous pour éviter le toucher dans toutes sortes d'UIControls:
Remarque: NE faites PAS cette vérification (vérifiez le type de classe Recognizer.view) le gestureRecognizerShouldBegin, cela ne fonctionnera pas.
la source
Voici une version Swift 3.0 :
N'oubliez pas de:
Make your tapper object delegate to self (e.g: tapper.delegate = self)
la source
Voici une version Swift:
N'oubliez pas de:
UIGestureRecognizerDelegate
tapper.delegate = self
)la source
La meilleure solution est à mon avis d'utiliser l'extrait de code ci-dessous:
la source