Je travaille sur une application iphone (iOS 4.0 ou plus) et j'ai quelques problèmes avec la gestion du toucher entre plusieurs vues. J'ai une structure de vue comme celle-ci
---> A superView
|
---> SubView - A
|
---> SubView - B (exactly on top of A, completely blocking A).
En fait, j'ai une super-vue, et des sous-vues A et B. B a le même cadre que A, ce qui fait que A est complètement caché.
Maintenant, mon exigence est la suivante.
- La sous-vue B doit recevoir tous les gestes de balayage et de tapotement (simples et doubles). gestes.
- La sous-vue A doit recevoir tous les gestes de pincement.
Voici comment j'ai ajouté les reconnaissances de gestes aux vues
UISwipeGestureRecognizer *leftSwipe = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(leftSwipe:)];
[leftSwipe setDirection:(UISwipeGestureRecognizerDirectionLeft)];
leftSwipe.delegate = self;
[bView addGestureRecognizer:leftSwipe];
[leftSwipe release];
UISwipeGestureRecognizer *rightSwipe = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(rightSwipe:)];
[rightSwipe setDirection:(UISwipeGestureRecognizerDirectionRight)];
rightSwipe.delegate = self;
[bView addGestureRecognizer:rightSwipe];
[rightSwipe release];
UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(handlePinch:)];
pinch.delegate = self;
[aView addGestureRecognizer:pinch];
[pinch release];
J'ai fait quelques recherches et pour moi UIGestureRecognizerDelegate
semblait prometteur et j'ai implémenté la méthode du délégué
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
J'ai renvoyé NO pour la sous-vue B, en espérant que la vue sous-jacente recevra ces événements. Mais pas de chance
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{
if ([gestureRecognizer isKindOfClass:[UIPinchGestureRecognizer class]] && [gestureRecognizer view] == bView) {
NSLog(@"pinchGesture");
//bView.userInteractionEnabled = NO;
return NO;
}
return YES;
}
Ensuite, j'ai désactivé l'interaction de l'utilisateur avec la sous-vue B dans le rappel du délégué (code commenté dans le bloc ci-dessus), lorsque le geste du pincement est reconnu, en espérant que la partie restante du geste sera reçue par la sous-vue A. Pas de chance là non plus
Voilà où j'en suis maintenant. J'ai vu ce question, où la réponse acceptée implique la propriété cancelsTouchesInView
. Mais je crois cancelsTouchesInView
n'annulez qu'un événement tactile particulier, ne le faites pas suivre.
Y a-t-il un autre moyen de répondre à mes besoins ? Je suis prêt à travailler sur n'importe quel indice que vous fournissez.
EDIT : BOUNTY TIME
Ma soi-disant sous-vue A est en fait une instance de la classe View d'une bibliothèque tierce, qui supprime toutes les touches et je n'ai aucun contrôle sur les gestes. Je veux une implémentation différente pour les balayages gauche et droit et je veux que le pincement, le tapotement, etc. fonctionnent exactement comme avec cette vue tierce. J'ai donc placé une vue au-dessus de A (sous-vue B) pour obtenir les balayages gauche et droit. Mais maintenant, je veux transmettre d'autres événements de gestes à la bibliothèque sous-jacente.