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

97

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

Merci.

compte eb
la source
Dans cette situation, je voudrais (et je pense que vous devriez) utiliser un UIButton personnalisé à la place.
titaniumdecoy
Vérifiez la version Swift Réponse http://stackoverflow.com/a/41328885/3177007
Mohamed Jaleel Nazir

Réponses:

137

En termes pratiques, ne faites pas cela.

Ajoutez plutôt un bouton avec un style personnalisé (pas de graphiques de bouton sauf si vous spécifiez 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 zone de l'écran agisse comme un bouton au lieu de jouer avec les éléments tactiles.

Kendall Helmstetter Gelner
la source
J'ai ajouté un bouton dans la barre de navigation et je peux également gérer les événements tactiles. Cependant, je souhaite ajouter une image ronde sur ce bouton. Pourriez-vous me dire comment puis-je faire cela par programme? Aussi, pourriez-vous me dire comment puis-je définir la propriété du bouton sur "personnalisé" par programmation?
ebaccount
Regardez la documentation pour UIButton - vous devez définir des images d'arrière-plan pour un état de contrôle, vous voudrez des images différentes pour Normal vs Sélectionné / Surligné. Le style du bouton est ce que vous définissez sur UIButtonStyleCustom, je crois - encore une fois, regardez la documentation pour la propriété style sur UIButton.
Kendall Helmstetter Gelner
1
L'ajout d'un UIButton au-dessus de UIImageView n'est-il pas un peu exagéré? Vous ajoutez un objet supplémentaire, alors que vous pouvez simplement implémenter les méthodes touch de l'objet UIImageView déjà existant. Non?
samvermette
32
Si vous regardez la taille d'un UIButton en mémoire, ce n'est pratiquement rien et vous n'en avez que quelques-uns par écran. Ce que vous obtenez gratuitement, c'est l'ensemble du câblage de l'action de la cible pour différents états (comme les retouches à l'intérieur) et également un comportement agréable comme ne pas déclencher lorsque vous appuyez vers le bas mais faites glisser un doigt sur le côté. Fondamentalement, les boutons sont l'un des objets les plus finement conçus de tout le système et penser que vous allez créer un code tactile personnalisé qui fonctionne mieux est de la folie. Utilisez ce qui est bon marché et qui fonctionne bien, enregistrez le travail personnalisé pour des choses que les frameworks ne gèrent pas déjà pour vous.
Kendall Helmstetter Gelner
6
Vous pouvez également superposer un UIControl si vous n'avez besoin que d'événements tactiles (via addTaget: action: forControlEvents :). C'est un peu moins cher qu'un UIButton qui a des images et plusieurs états. De plus, j'utilise des conditions de préprocesseur pour changer la couleur d'arrière-plan du contrôle superposé en rose afin que je puisse voir exactement où elles se trouvent (et me rappeler qu'elles existent :-).
Jeff
115

A UIImageViewest dérivé de UIViewqui est dérivé de UIResponder, il est donc prêt à gérer les événements tactiles. Vous aurez envie de fournir les touchesBegan, touchesMovedet les touchesEndedméthodes et déclencher leur si l'utilisateur tape l'image. Si tout ce que vous voulez est un événement tap, il est plus facile d'utiliser simplement un bouton personnalisé avec l'image définie comme image du bouton. Mais si vous voulez un contrôle plus fin sur les taps, les mouvements, etc., c'est la voie à suivre.

Vous voudrez également examiner quelques autres choses:

  • Remplacez canBecomeFirstResponderet retournez YES pour indiquer que la vue peut devenir le focus des événements tactiles (la valeur par défaut est NON).

  • Définissez la userInteractionEnabledpropriété sur OUI. La valeur par défaut pour UIViewsest YES, mais pour UIImageViewsest NON, vous devez donc l'activer explicitement.

  • Si vous souhaitez répondre à des événements multi-touch (par ex. Pincement, zoom, etc.), vous devrez régler multipleTouchEnabledsur OUI.

Ramin
la source
J'ai essayé ça mais jamais moins je ne reçois les événements touchBegan ... pourquoi ça?
Markus
5
@Markus: J'ai eu le même problème, mais je l'ai résolu en définissant userInteractionEnabledsur OUI sur ma vue parent. Voir stackoverflow.com/questions/5887305/…
Saxon Druce
51

Pour ajouter un événement tactile à une 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.

Ouaip.
la source
userInteractionEnabled = true est la partie facile à oublier, merci.
Michael Peterson
23

Vous pouvez également ajouter un UIGestureRecognizer. Il ne vous oblige pas à ajouter un élément supplémentaire dans votre hiérarchie de vues, mais vous fournit toujours 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];
spolu
la source
10
N'oubliez pas de définir UserInteractionEnabled pour imgView_
Anonymous White
13

J'ai été sur différents sujets ces dernières heures pour essayer de trouver une solution à mon problème, en vain. Je vois que de nombreux développeurs partagent ce problème, et je pense que les gens ici le savent. J'ai plusieurs images à l'intérieur d'un UIScrollView, essayant d'obtenir des événements de tap sur eux.

je n'obtiens aucun événement d'un UIImangeView, mais j'obtiens un événement d'un similaire UILableavec des paramètres très similaires que je lui définis. sous IOS 5.1.

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

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

En joignant du code ci-dessous, dans ce code, j'initialise à la fois a UIImageViewet 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 robinet d'étiquette est reçu.

ilan
la source
6

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

Commencez par faire la vue de l'image:

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

Ensuite, créez l'élément de bouton de barre hors de votre vue d'image:

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

Ajoutez ensuite l'élément de bouton de barre à votre barre de navigation:

self.navigationItem.rightBarButtonItem = yourBarButtonItem;

N'oubliez pas que ce code entre dans le contrôleur de vue qui se trouve à l'intérieur d'un tableau de contrôleur de navigation viewcontroller. Donc, fondamentalement, cet "élément de bouton de barre de recherche d'image tactile" n'apparaîtra dans la barre de navigation que lorsque ce contrôleur de vue est affiché. Lorsque vous appuyez sur un autre contrôleur de vue, cet élément du bouton de la barre de navigation disparaît ~

yujean
la source
3

Ce que vous voudrez peut-être faire est de remplacer la touchesBegan:withEvent:méthode de la UIView(ou de la sous-classe) qui contient votre sous- UIImageViewvue.

Dans cette méthode, testez si l'une des UITouchtouches tombe dans les limites de l' UIImageViewinstance (disons qu'elle est appelée imageView).

Autrement dit, l' CGPointélément se [touch locationInView]croise-t-il avec l' CGRectélément [imageView bounds]? Regardez dans la fonction CGRectContainsPointpour exécuter ce test.

Alex Reynolds
la source
Merci pour votre réponse. J'ai ajouté la vue comme ceci: [navBar addSubview: self.pImage]; // ajouté comme sous-vue de la barre de navigation. J'ai remplacé la fonction mais la fonction n'est jamais appelée. J'ai cependant défini la propriété userInteractionEnabled de UIImageView sur YES. Est-ce que je manque quelque chose?
ebaccount
Découvrez la méthode touchesBegan: withEvent:. Il existe de nombreux exemples sur les moteurs de recherche de la façon dont cela fonctionne.
Alex Reynolds
1

Vous devez d'abord placer un UIButton, puis soit vous pouvez ajouter une image d'arrière-plan pour ce bouton, soit vous devez placer une UIImageView sur le bouton.

ou

Vous pouvez ajouter le geste de pression à une UIImageView afin d'obtenir l'action de clic lorsque vous appuyez sur UIImageView.

Hilaj
la source
0

Pour ceux d'entre vous qui recherchent une solution Swift 4 à cette réponse. Vous pouvez utiliser ce qui suit pour détecter un événement tactile sur une 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
}
Josh
la source
-2

Ajoutez un geste sur cette vue.Ajoutez une image dans cette vue, cela détecterait également le geste sur l'image.Pourriez-vous essayer avec la méthode déléguée de l'événement tactile, alors dans ce cas, il pourrait également détecter. Merci

user1240409
la source