Quel objet, ou vue, ai-je touché?


0

Travailler dans un ViewController qui a quelques vues qui ont été ajoutés comme subviews et j'ai une méthode touchesBegan:

UIImageView *testImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"test.png"]]; 
    testImage.frame = CGRectMake(0, 0, 480, 280); 
    [self.view addSubview:testImage]; 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    CGPoint point; 
    UITouch *touch = [touches anyObject]; 
    point.x = [touch locationInView:self.view].x; 
    point.y = [touch locationInView:self.view].y; 

    if (point.y >= 280 && point.y <= 320) 
    { 
     if (point.x >= 0 && point.x <= 160) 
     { 
      [self menu1]; 
     } 

     if (point.x >= 161 && point.x <= 320) 
     { 
      [self menu2]; 
     } 

     if (point.x >= 321 && point.x <= 480) 
     { 
      [self menu3]; 
     } 
    } 
} 

Ma question est de savoir comment dans cette méthode puis-je discerner quelle vue a été cliqué? Je l'ai fait avec ces coordonnées d'écran, mais cela ne fonctionnera pas si je déplace également ces vues à l'exécution.

Est-il possible de voir quelle vue a été cliqué sur la touche ou événement ou dans ce code de ci-dessus:

UITouch *touch = [touches anyObject]; 

Toute aide appréciée :) //

3

Supposons que vous avez un contrôleur de vue avec ces Ivars (se connecter à des contrôles dans Interface Builder)

IBOutlet UILabel *label; 
IBOutlet UIImageView *image; 

Pour savoir si un contact a frappé ces éléments ou l'arrière-plan, vue ajouter cette méthode à votre contrôleur de vue.

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; 
{ 
    UITouch *touch = [[event allTouches] anyObject]; 

    if ([touch view] == label) { 
     NSLog(@"touched the label"); 
    } 

    if ([touch view] == image) { 
     NSLog(@"touched the image"); 
    } 

    if ([touch view] == self.view) { 
     NSLog(@"touched the background"); 
    } 
} 

Toute sous-classe UIView comme un UIView, UILabel ou UIImageView que vous voulez répondre à des touches doit avoir la .userInteractionEnabled propriété est définie sur OUI.

  0

C'est super, merci :) 07 déc.. 092009-12-07 23:35:48


1

je pourrais manquer quelque chose, mais vos éléments "menuX" n'auraient-ils pas leurs propres rects décrivant leur taille et leur emplacement? Ensuite, tout ce que vous faites est de demander si le point est dans ces rectangles.


3

[touch view] vous donnera la vue dans laquelle le contact s'est initialement produit (c'est-à-dire que cette vue restera la même même si l'utilisateur éloigne le doigt de la vue pendant le contact).

Si ce n'est pas le comportement dont vous avez besoin, utilisez:

[self.view hitTest:[touch locationInView:self.view] withEvent:event]; 
  0

C'est cool, j'aimerais pouvoir marquer 2 réponses comme correctes :) 07 déc.. 092009-12-07 23:37:13


1

Pourquoi utilisez-vous votre propre test de recherche? C'est trivial juste de placer des boutons transparents où vous le voulez.