102 votes

Gestion de l'événement tactile dans UILabel et connexion à une IBAction

Ok, donc j'ai un UILabel créé dans le constructeur d'interface qui affiche un texte par défaut du type "tapez pour commencer".

Lorsque l'utilisateur touche le UILabel Je veux qu'il déclenche une méthode IBAction : -(IBAction)next; qui met à jour le texte de l'étiquette pour dire quelque chose de nouveau.
Ce serait vraiment pratique si cela me permettait de faire simplement glisser une connexion de ma méthode vers mon étiquette et de sélectionner ensuite la touche à l'intérieur, comme avec un bouton. mais hélas, pas de cigare.

Quoi qu'il en soit, je suppose que ma question est, vais-je devoir sous-classer UILabel pour que ça marche ? Ou existe-t-il un moyen de faire glisser un bouton sur l'étiquette, mais en le rendant opaque à 0 %. Ou bien y a-t-il une solution plus simple qui m'échappe ?

255voto

Scott Persinger Points 1654

Regardez ça :

UILabel *label = ...
label.userInteractionEnabled = YES;
UITapGestureRecognizer *tapGesture =
      [[UITapGestureRecognizer alloc] initWithTarget:self 
                                              action:@selector(labelTap)];
[label addGestureRecognizer:tapGesture];

L'astuce consiste à permettre l'interaction avec l'utilisateur.

1 votes

Et si j'ai plusieurs étiquettes ? Comment pourrais-je différencier celle qui a été tapée ?

1 votes

@learner essayer la propriété tag. s'assurer d'utiliser labelTap : au lieu de labelTap. et utiliser - (void) labelTap :(id)sender ;.

1 votes

@thedjaney L'expéditeur est le UITapGestureRecognizer, pas le UILabel.

70voto

Remover Points 909

UILabel hérite de UIView qui hérite de UIResponder. Tous les objets UIresponder peuvent gérer les événements tactiles. Ainsi, dans votre fichier de classe qui connaît votre vue (qui contient le UIlabel), implémentez :

-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event;

Dans le constructeur d'interface, définissez la valeur de l'étiquette UILabel. Lorsque des touches se produisent dans votre méthode touchesBegan, vérifiez la valeur de l'étiquette de la vue à laquelle l'étiquette appartient :

UITouch *touch = [touches anyObject];

if(touch.view.tag == MY_TAG_VAL)
label.text = @"new text";

Vous connectez votre code dans votre fichier de classe avec l'objet UILabel dans le constructeur d'interface en déclarant votre variable d'instance UILabel avec le préfixe IBOutlet :

IBOutlet UILabel *label;

Ensuite, dans le constructeur d'interface, vous pouvez les connecter.

31 votes

Une remarque, vous devez vous assurer que vous cochez "User Interaction Enabled" dans le constructeur d'interface, sinon cela ne fonctionnera pas.

0 votes

J'ai rencontré un problème avec cette méthode. Elle fonctionnait bien lorsque le contrôleur de vue était chargé directement, mais lorsque j'ai créé un contrôleur de navigation, que j'ai poussé le contrôleur contenant l'étiquette vers le contrôleur de navigation puis que je l'ai affiché, les touches ne semblent plus atteindre l'étiquette. Avez-vous une idée ?

0 votes

Si c'est la même classe de contrôleur de vue que vous poussez, cela devrait fonctionner. il semble qu'il y ait un autre petit problème. commencez peut-être une autre question et postez du code.

31voto

Eiko Points 19502

Vous pouvez utiliser un UIButton, le rendre transparent, c'est-à-dire un type personnalisé sans image, et y ajouter un UILabel (centré). Ensuite, vous pouvez utiliser les événements normaux du bouton.

0 votes

Je suis d'accord, le type de bouton personnalisé devrait vous donner une expérience utilisateur de type UILabel.

2 votes

+1, agréable et simple. J'avais déjà essayé en mettant un bouton normal à l'opacité 0, ce qui n'a pas fonctionné, mais l'astuce pour changer le type en personnalisé a parfaitement fonctionné.

0 votes

L'opacité affectera le bouton et toutes ses sous-vues, donc opacité=0 rendra l'ensemble invisible.

23voto

César Cruz Points 386

Swift 3

Vous avez un IBOutlet

@IBOutlet var label: UILabel!

Dans lequel vous activez l'interaction avec l'utilisateur et ajoutez un dispositif de reconnaissance des gestes.

label.isUserInteractionEnabled = true
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(userDidTapLabel(tapGestureRecognizer:)))
label.addGestureRecognizer(tapGesture)

Et enfin, manipuler le robinet

func userDidTapLabel(tapGestureRecognizer: UITapGestureRecognizer) {
  // Your code goes here
}

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