98 votes

Comment puis-je détecter l’événement de touche d’un UIImageView

J’ai placé une image (UIImageView) sur la barre de navigation. Maintenant, je veux détecter l’événement tactile et souhaitez gérer l’événement. Pourriez-vous me faire savoir comment je peux le faire ?

Merci.

138voto

En termes pratiques, ne fais pas ça.

À la place, ajoutez un bouton avec le style Custom (aucun bouton graphique, à moins que vous spécifiiez images) au fil de la UIImageView. Puis quelque méthodes vous voulez appelé à celle d’attachement.

Vous pouvez utiliser cette technique pour beaucoup de cas où vous voulez vraiment certaines zone de l’écran d’agir comme un bouton au lieu de jouer avec les trucs de Touch.

115voto

Ramin Points 10412

Un UIImageView est dérivé à partir d'un UIView qui est dérivée à partir de UIResponder il est donc prêt à gérer les événements tactiles. Vous aurez envie de fournir à l' touchesBegan, touchesMoved, et touchesEnded méthodes, et ils vont obtenir appelée si l'utilisateur appuie sur l'image. Si tout ce que vous voulez, c'est un robinet d'événement, il est plus facile de simplement utiliser un bouton personnalisé avec l'image comme l'image du bouton. Mais si vous voulez plus fine-grain de contrôle sur les robinets, les déplacements, etc. c'est le chemin à parcourir.

Vous aurez également besoin de regarder un peu plus les choses:

  • Remplacer canBecomeFirstResponder et retour OUI pour indiquer que la vue peut faire l'objet d'événement tactile (la valeur par défaut est NO).

  • Définir l' userInteractionEnabled de la propriété de OUI. La valeur par défaut de UIViews est OUI, mais pour l' UIImageViews NON, vous devez explicitement l'allumer.

  • Si vous souhaitez répondre à multi-touch à des événements (pincer, zoomer, etc), vous devrez définir multipleTouchEnabled de OUI.

51voto

Nate Berman Points 194

Pour ajouter un événement de touche à un UIImageView utilisez ce qui suit dans votre ".m"

espoir qui aide.

23voto

spolu Points 497

Vous pouvez également ajouter un UIGestureRecognizer. Il ne nécessite pas d’ajouter un élément supplémentaire dans votre hiérarchie d’affichage, mais fournit encore que vous aurez tout le code bien écrit pour gérer des événements de touche avec une interface assez simple :

13voto

ilan Points 121

J'ai été sur différents threads sur le passé quelques heures à essayer de trouver une solution à mon problème, en vain. Je vois que beaucoup de devs part de ce problème, et je pense que les gens savent à ce sujet. J'ai plusieurs images à l'intérieur d'un UIScrollView, en essayant d'obtenir appuyez sur événements.

ne pas obtenir des événements à partir d'un UIImangeView, mais je ne reçois qu'un événement de ce genre de UILable très similaire à des paramètres que je suis en train de. sous IOS 5.1

J'ai déjà fait ce qui suit:

  1. ensemble setUserInteractionEnabled OUI pour les deux UIImageView et parent vue
  2. ensemble setMultipleTouchEnabled OUI pour UIImageView
  3. Essayé sous-classement UIImageView, n'a pas aider tout

Fixation de certains de code ci-dessous, dans ce code, je l'ai initialiser une UIImageView et UILabel, le label fonctionne bien en termes de déclencher des événements. J'ai essayé de garder hors de propos de code. Merci les gars, Ilan

UIImageView *single_view = [[UIImageView alloc]initWithFrame:CGRectMake(200, 200, 100, 100)];
single_view.image=img;
single_view.layer.zPosition=4;
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapGestureCaptured:)];
[single_view addGestureRecognizer:singleTap];
[single_view setMultipleTouchEnabled:YES];
[single_view setUserInteractionEnabled:YES];
[self.myScrollView addSubview:single_view];    
self.myScrollView.userInteractionEnabled=YES;
UILabel *testLabel = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
testLabel.backgroundColor=[UIColor redColor];
[self.myScrollView addSubview:testLabel];
[testLabel addGestureRecognizer:singleTap];  
[testLabel setMultipleTouchEnabled:YES];
[testLabel setUserInteractionEnabled:YES];
testLabel.layer.zPosition=4;

Et la méthode qui gère l'événement:

    - (void)singleTapGestureCaptured:(UITapGestureRecognizer *)gesture
{ 
UIView *tappedView = [gesture.view hitTest:[gesture locationInView:gesture.view] withEvent:nil];
NSLog(@"Touch event on view: %@",[tappedView class]);
}

Comme l'a dit, l'étiquette tap est reçu

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X