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.
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.
Réponses:
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.
A UIImageView
est dérivé de UIView
qui est dérivé de UIResponder
, il est donc prêt à gérer les événements tactiles. Vous aurez envie de fournir les touchesBegan
, touchesMoved
et les touchesEnded
mé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 canBecomeFirstResponder
et 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 userInteractionEnabled
propriété sur OUI. La valeur par défaut pour UIViews
est YES, mais pour UIImageViews
est 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 multipleTouchEnabled
sur OUI.
userInteractionEnabled
sur OUI sur ma vue parent. Voir stackoverflow.com/questions/5887305/…
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.
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];
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 UILable
avec des paramètres très similaires que je lui définis. sous IOS 5.1.
J'ai déjà fait ce qui suit:
UIImageView
.UIImageView
, n'a aidé aucun.En joignant du code ci-dessous, dans ce code, j'initialise à la fois a UIImageView
et 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.
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 ~
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- UIImageView
vue.
Dans cette méthode, testez si l'une des UITouch
touches tombe dans les limites de l' UIImageView
instance (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 CGRectContainsPoint
pour exécuter ce test.
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.
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
}
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