2009-08-17 5 views
0

J'ai un grand UIView qui répond aux touches, et il est couvert avec beaucoup de petits UIViews qui répondent différemment aux touches. Est-il possible de toucher n'importe où sur l'écran et de faire le tour, et de faire savoir à chaque vue si elle est touchée? Par exemple, je place mon doigt sur le coin supérieur gauche et je le glisse vers le coin inférieur droit. La touche touchesBegan/Moved est collectée par la baseView. Lorsque je passe sur itemView1, itemView2 et itemView3, le contrôle leur est transmis. Si je lève mon doigt alors que sur itemView2, il effectue la méthode touchEnded de itemView2. Si je lève mon doigt sur aucun des éléments, il effectue des touches de baseViewEnded.Puis-je détecter si une sous-vue supérieure a été touchée?

Pour le moment, si j'appuie sur baseView, touchEnded est toujours baseView et les itemsViews supérieurs sont ignorés.

Des idées?

Répondre

1

Si je comprends bien, l'événement touchesEnded est détecté, mais pas par la sous-vue qui doit en être informée. Je pense que cela pourrait fonctionner pour vous:

Dans un fichier commun, définissez TOUCHES_ENDED_IN_SUPERVIEW comme @ "touches terminées dans superview".

Dans le procédé touchesEnded de la vue contenant que est cuisson, ajouter

[[NSNotificationCenter defaultCenter] postNotificationName: TOUCHES_ENDED_IN_SUPERVIEW object: self]; 

Dans le touchesBegan des sous-vues, ajouter

[[NSNotificationCenter defaultCenter] addObserver: self 
    selector: @selector(touchesEnded:) 
    name: TOUCHES_ENDED_IN_SUPERVIEW 
    object: self.superview]; 

Dans les procédés touchesEnded des sous-vues, l'utilisation votre logique normale pour l'événement, et également ajouter

[[NSNotificationCenter defaultCenter] removeObserver: self name: TOUCHES_ENDED_IN_SUPERVIEW object: self.superview]; 

N'oubliez pas de mettre [[NSNotificationCenter defaultCenter] removeObserver: self] dans votre dealloc également, au cas où il serait possible de quitter la page sans avoir reçu l'événement touchesEnded.

Vous souhaiterez peut-être que la notification envoie son message à une méthode spéciale touchesEndedInSuperview, qui appelle elle-même touchesEnded, mais cela dépend si vous avez un traitement spécial à faire dans ce cas.

+0

Merci Amagrammer, je vais donner ce coup. Cela me semble bien, mais j'ai depuis découpé mon code pour ne pas impliquer cela pour l'instant, et je ne veux pas recommencer à ouvrir ces portes. Si cela fonctionne, je serai sûr de vous le faire savoir. –

0

Vous pouvez utiliser quelque chose comme ceci:


-(void)touchesEnded: (NSSet *)touches 
      withEvent: (UIEvent *)event { 
    UITouch *touch = [touches anyObject]; 
    CGPoint location = [touch locationInView: touch.view]; 
    if (CGRectContainsPoint(control1.frame, location)) { 
     [self control1Action]; 
    } else if (CGRectContainsPoint(control2.frame, location)) { 
     [self control2Action]; 
    } 
} 
Questions connexes