Comment est-ce que je bascule caché d'une label pendant qu'un button est pressé?

J'essaie de comprendre comment afficher une label seulement quand un button est pressé dans OS. Je sais comment faire fonctionner les events tactiles mais je ne suis pas sûr de savoir comment incorporer le UILongPressGestureRecognizer dans cela.

La class UIButton , ainsi que beaucoup d'autres sous-classs UIControl peuvent avoir de nombreuses actions UIControl à eux.

Lorsque nous relions une action d'un constructor d'interface à notre file de code source, si nous ouvrons le drop down menu "Evénement", une longue list d'options s'affiche:

Choisir l'événement IBAction

Dans presque tous les scénarios, nous accrochons nos actions uniquement à «Touch Up Inside». Cela permet à l'user de se requestr s'il veut vraiment appuyer sur le button. S'ils retirent leur doigt du button avant de le lâcher, l'action ne se triggers pas, parce que le geste «en haut» s'est produit en dehors des limites de l'object.

Mais ici, nous voulons réellement accrocher l'événement "touch down" de notre button. C'est à ce moment que nous afficherons l'label.

Allons de l'avant et créons un évènement «toucher en bas» et un événement «retouche à l'intérieur»:

Rapide

 @IBAction func buttonTouchDown(sender: UIButton) { self.myLabel.hidden = false } @IBAction func buttonTouchEnded(sender: UIButton) { self.myLabel.hidden = true } 

Objectif c

 - (IBAction)buttonTouchDown:(UIButton *)sender { self.myLabel.hidden = NO; } - (IBAction)buttonTouchEnded:(UIButton *)sender { self.myLabel.hidden = YES; } 

Jusqu'à présent, buttonTouchEnded est réglé complètement normalement, et buttonTouchDown été configuré en sélectionnant «toucher» dans la list «Événement».

Nous pouvons toujours vérifier à quoi notre contrôle est relié en cliquant droit dans le constructor de l'interface:

Bouton envoyé des événements

Mais ce menu est utile pour plus que simplement vérifier ce que nous avons déjà connecté. À partir de là, nous pouvons relier n'importe laquelle des autres actions à nos methods @IBAction existantes simplement en cliquant dans le cercle et en faisant glisser vers la méthode existante.

Donc, nous voulons évidemment que l'label disparaisse si nous arrêtons d'appuyer sur le button, une retouche normale comme si vous utilisiez un autre button. La seule question qui rest est, quel comportement exact voulez-vous?

Si vous voulez que l'label disparaisse seulement quand le doigt est levé, peu importe où le doigt va, alors nous devons également accrocher "retoucher dehors".

Si vous voulez que l'label disparaisse lorsque l'user retire son doigt du button, alors nous devrions raccorder l'action "touch drag exit".

Nous souhaitons également probablement connecter l'action «Touch Cancel», qui se produirait si une sorte d'événement système (peut-être un appel téléphonique entrant) annulait le contact.

Cette réponse de débordement de stack élabore sur les différences entre les options d'action que nous avons, de sorte que vous pouvez concevoir le comportement exactement comme vous en avez besoin.

Quoi qu'il en soit, une fois que nous décidons des actions que nous voulons connecter à quelles methods, faites apparaître le menu contextuel et cliquez-faites glisser des cercles vers les methods:

Accrocher "Touch Cancel" à buttonTouchEnded (expéditeur :)

La solution la plus simple consiste à append une action à l'événement touchDown et une action distincte à touchUpInside et à touchUpOutside.

Affichez l'label sur l'action touchDown et masquez-la dans l'action touchUpInside / touchUpOutside. (et pour l'exhaustivité, sur touchCancel, comme suggéré par nhgrif dans sa réponse très approfondie.)

Un long dispositif de reconnaissance des gestes ne fonctionnera pas dans cette situation. Vous pouvez créer un outil de reconnaissance de gestes personnalisé qui a déclenché un événement au toucher et un autre événement lors de la publication, et l'utiliser. Ce n'est pas si difficile à faire.

MODIFIER

Je viens de download un projet de démo sur GitHub appelé " MorphingButton " (lien) que j'ai créé pour une autre question ici sur Stack Overflow.

Ce projet affiche maintenant une label sur le button de l'application et cache l'label lorsque vous relâchez le button.

Le projet est un projet hybride Swift / Objective-C qui montre comment faire le morphing des buttons et afficher / masquer l'label dans les deux langues. Il dispose d'une barre d'tabs avec un onglet Swift et un onglet Objective-C.