web-dev-qa-db-fra.com

comment puis-je détecter l'événement tactile d'un UIImageView

J'ai placé une image (UIImageView) dans la barre de navigation. Maintenant, je veux détecter l'événement tactile et je veux le gérer. Pourriez-vous me dire comment puis-je faire cela?

Merci. 

95
ebaccount

En pratique, ne faites pas ça.

Au lieu de cela, ajoutez un bouton avec un style personnalisé (aucun graphique de bouton à moins de spécifier des images) sur UIImageView. Ensuite, attachez les méthodes que vous souhaitez appeler à cela.

Vous pouvez utiliser cette technique dans de nombreux cas où vous voulez vraiment qu'une partie de l'écran agisse comme un bouton au lieu de jouer avec les commandes tactiles.

Une UIImageView est dérivée d'une UIView qui est dérivée de UIResponder afin qu'elle soit prête à gérer les événements tactiles. Vous voudrez fournir les méthodes touchesBegan, touchesMoved et touchesEnded et elles seront appelées si l'utilisateur appuie sur l'image. Si tout ce que vous voulez, c'est un événement tap, il est plus facile d'utiliser un bouton personnalisé avec l'image définie comme image du bouton. Mais si vous souhaitez un contrôle plus précis des robinets, des déplacements, etc., c'est la voie à suivre.

Vous voudrez également regarder quelques autres choses:

  • Remplacez canBecomeFirstResponder et retournez YES pour indiquer que la vue peut devenir le point central des événements tactiles (la valeur par défaut est NO).

  • Définissez la propriété userInteractionEnabled sur YES. La valeur par défaut pour UIViews est OUI, mais pour UIImageViews est NON, vous devez donc l'activer explicitement.

  • Si vous souhaitez répondre à des événements tactiles multiples (par exemple, un pincement, un zoom, etc.), vous devez définir multipleTouchEnabled sur YES.

115
Ramin

Pour ajouter un événement tactile à un UIImageView, utilisez ce qui suit dans votre .m

UITapGestureRecognizer *newTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(myTapMethod)];

[myImageView setUserInteractionEnabled:YES];

[myImageView addGestureRecognizer:newTap];


-(void)myTapMethod{
    // treat image tap
}

j'espère que cela pourra aider.

49
Yup.

Vous pouvez également ajouter un UIGestureRecognizer. Cela ne vous oblige pas à ajouter un élément supplémentaire dans votre hiérarchie de vues, mais vous fournit tout le code bien écrit pour gérer les événements tactiles avec une interface assez simple:

    UISwipeGestureRecognizer *swipeRight = [[UISwipeGestureRecognizer alloc]
                                            initWithTarget:self action:@selector(handleSwipe:)];
    swipeRight.direction = UISwipeGestureRecognizerDirectionRight;
    [imgView_ addGestureRecognizer:swipeRight];        
    [swipeRight release];
    UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc]
                                            initWithTarget:self action:@selector(handleSwipe:)];
    swipeLeft.direction = UISwipeGestureRecognizerDirectionLeft;
    [imgView_ addGestureRecognizer:swipeLeft];
    [swipeLeft release];
23
spolu

Ces dernières heures, je me suis penchée sur différents sujets pour essayer de trouver une solution à mon problème, mais en vain… Je vois que de nombreux développeurs partagent ce problème, et je pense que les gens ici en savent quelque chose…. avoir plusieurs images dans une UIScrollView, en essayant d’obtenir des événements de tap sur elles.

je ne reçois aucun événement d'une UIImangeView, mais j'obtiens un événement d'un UILable similaire avec des paramètres très similaires que je lui ai définis. sous IOS 5.1.

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

  1. définissez setUserInteractionEnabled sur YES pour les vues `UIImageView et parent
  2. définissez setMultipleTouchEnabled sur YES pour UIImageView.
  3. Essayé de sous-classer UIImageView, n'a aidé aucun.

En attachant du code ci-dessous, dans ce code, j’initialise à la fois une UIImageView et une UILabel, l’étiquette fonctionne bien en termes d’événements de déclenchement. J'ai essayé de garder le code non pertinent . 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 dit, le tap label est reçu.

13
ilan

Au lieu de créer un UIImageView tactile, puis de le placer sur la barre de navigation, vous devez simplement créer un UIBarButtonItem, que vous créez à partir d'un UIImageView.

Commencez par afficher l'image:

UIImageView *yourImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"nameOfYourImage.png"]];

Ensuite, créez l’élément de bouton à barres à partir de votre vue d’image:

UIBarButtonItem *yourBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:yourImageView];

Ajoutez ensuite le bouton de la barre à votre barre de navigation:

self.navigationItem.rightBarButtonItem = yourBarButtonItem;

Rappelez-vous que ce code va dans le contrôleur de vue qui se trouve dans un tableau de contrôleur de navigation. Donc, fondamentalement, cet "élément de bouton tactile ressemblant à une barre" n'apparaîtra dans la barre de navigation que lorsque ce contrôleur de vue apparaît. Lorsque vous appuyez sur un autre contrôleur de vue, cet élément de bouton de la barre de navigation disparaît ~

6
yujean

Vous voudrez peut-être remplacer la méthode touchesBegan:withEvent: de la UIView (ou sous-classe) qui contient votre sous-vue UIImageView.

Dans cette méthode, teste si l'un des contacts UITouch tombe dans les limites de l'instance UIImageView (disons qu'il s'appelle imageView). 

C'est-à-dire que l'élément CGPoint et [touch locationInView] se croisent avec l'élément CGRect et [imageView bounds]? Examinez la fonction CGRectContainsPoint pour exécuter ce test.

3
Alex Reynolds

Vous devez d’abord placer un UIButton, puis vous pouvez soit ajouter une image de fond pour ce bouton, soit vous devez placer un UIImageView sur le bouton.

ou 

Vous pouvez ajouter le geste de toucher à un UIImageView afin que l'action de clic se produise lorsque vous appuyez sur le UIImageView.

1
Hilaj

Pour ceux qui recherchent une solution Swift 4 à cette réponse. Vous pouvez utiliser ce qui suit pour détecter un événement tactile sur un UIImageView.

let gestureRecognizer: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageViewTapped))
imageView.addGestureRecognizer(gestureRecognizer)
imageView.isUserInteractionEnabled = true

Vous devrez ensuite définir votre sélecteur comme suit:

@objc func imageViewTapped() {
    // Image has been tapped
}
0
Josh