Come fare in modo che UILabel risponda al tocco?


94

Ho scoperto che posso creare UILabel molto più velocemente di UITextField e ho intenzione di utilizzare UILabel la maggior parte del tempo per la mia app di visualizzazione dei dati.

Per farla breve, però, desidero che l'utente tocchi un'etichetta UIL e che la mia richiamata risponda. È possibile?

Grazie.


1
È necessario specificareuserInteractionEnabled = true
onmyway133

Risposte:


208

Puoi aggiungere UITapGestureRecognizerun'istanza alla tua UILabel.

Per esempio:

UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(labelTapped)];
tapGestureRecognizer.numberOfTapsRequired = 1;
[myLabel addGestureRecognizer:tapGestureRecognizer];
myLabel.userInteractionEnabled = YES;

13
Ah, la proprietà 'userInteractionEnabled' qui è fondamentale (poiché l'altra configurazione può e deve essere preferibilmente impostata negli storyboard). Per impostazione predefinita di Label, l'interazione è disattivata in modo da passare attraverso i tocchi attraverso di loro, ma in questo caso devono osservare i tocchi affinché il riconoscimento dei gesti si attivi. Grazie!
Marchy

1
Ben fatto! Stavo solo toccando un'etichetta e mi sono completamente dimenticato di abilitare l'interazione dell'utente. Grazie!
Mike Critchley

37

Se stai utilizzando gli storyboard, puoi eseguire l'intero processo nello storyboard senza codice aggiuntivo. Aggiungi un'etichetta allo storyboard, quindi aggiungi un gesto di tocco all'etichetta. Nel riquadro Utilità, assicurati che sia selezionata l'etichetta "Interazione utente abilitata". Dal gesto del tocco (nella parte inferiore del controller della vista nello storyboard), ctrl + clic e trascina sul file ViewController.h e crea un'azione. Quindi implementare l'azione nel file ViewController.m.


Metodo disponibile anche utilizzando il generatore di interfacce da solo senza storyboard
Gomino

Assicurati che "Interazione utente abilitata" sia selezionata nella sezione Visualizza nell'ispettore Attributi , non solo nei tratti di accessibilità.
SeanR

17

Swift 3.0

Inizializza il gesto per tempLabel

tempLabel?.text = "Label"
let tapAction = UITapGestureRecognizer(target: self, action: #selector(self.actionTapped(_:)))
tempLabel?.isUserInteractionEnabled = true
tempLabel?.addGestureRecognizer(tapAction)

Ricevitore di azioni

func actionTapped(_ sender: UITapGestureRecognizer) {
    // code here
}

Swift 4.0

Inizializza il gesto per tempLabel

tempLabel?.text = "Label"
let tapAction = UITapGestureRecognizer(target: self, action:@selector(actionTapped(_:)))
tempLabel?.isUserInteractionEnabled = true
tempLabel?.addGestureRecognizer(tapAction)

Ricevitore di azioni

func actionTapped(_ sender: UITapGestureRecognizer) {
    // code here
}

Come ottenere il testo dell'etichetta dall'oggetto mittente? In altre parole come identificare il mittente?
Vineel

La versione di Swift 4 ha @selector invece di #selector.
Kirby Todd

8

Swift 2.0:

Sto aggiungendo una stringa nsmutable come testo di sampleLabel, consentendo l'interazione dell'utente, aggiungendo un gesto di tocco e attivando un metodo.

override func viewDidLoad() {
    super.viewDidLoad()

    let newsString: NSMutableAttributedString = NSMutableAttributedString(string: "Tap here to read the latest Football News.")
    newsString.addAttributes([NSUnderlineStyleAttributeName: NSUnderlineStyle.StyleDouble.rawValue], range: NSMakeRange(4, 4))
    sampleLabel.attributedText = newsString.copy() as? NSAttributedString

    let tapGesture: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "tapResponse:")
    tapGesture.numberOfTapsRequired = 1
    sampleLabel.userInteractionEnabled =  true
    sampleLabel.addGestureRecognizer(tapGesture)

}
func tapResponse(recognizer: UITapGestureRecognizer) {
    print("tap")
}

4

Puoi invece usare un pulsante UIB e impostare il testo come desideri. Il pulsante non deve avere l'aspetto di un pulsante se non lo desideri


1
A questo proposito, ho sempre avuto problemi con il pulsante UIB che giustifica a sinistra il testo su più righe. Anche quando ho impostato l'allineamento a sinistra al centro, succede ancora.
Buon

Ho provato UIButton ed è piuttosto carino. Sono solo i pulsanti multilinea che sono un problema. Grazie.
Buon

3

Per aggiungere il gesto Tap su UILable

UITapGestureRecognizer *tapAction = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(lblClick:)];
tapAction.delegate =self;
tapAction.numberOfTapsRequired = 1;

//Enable the lable UserIntraction
lblAction.userInteractionEnabled = YES;
[lblAction addGestureRecognizer:tapAction];   

e per valutare il metodo di selezione

- (void)lblClick:(UITapGestureRecognizer *)tapGesture {

}

Nota: aggiungi UIGestureRecognizerDelegate nel file .h


2

Versione rapida: var tapGesture : UITapGestureRecognizer = UITapGestureRecognizer()

Quindi all'interno viewDidLoad(), aggiungi questo:

  let yourLbl=UILabel(frame: CGRectMake(x,y,width,height)) as UILabel!

    yourLbl.text = "SignUp"
    tapGesture.numberOfTapsRequired = 1
    yourLbl.addGestureRecognizer(tapGesture)
    yourLbl.userInteractionEnabled = true
    tapGesture.addTarget(self, action: "yourLblTapped:")

1

Se desideri utilizzare il testo su più righe nel tuo pulsante, crea un UILabelcon testo multilinea e aggiungilo come sottoview al tuo pulsante.

per esempio:

yourLabel=[Uilabel alloc]init];
yourLabel.frame=yourButtom.Frame;//(frame size should be equal to your button's frame)
[yourButton addSubView:yourLabel]

1

Swift 3 di Alvin George

override func viewDidLoad() {
    super.viewDidLoad()
    let newsString: NSMutableAttributedString = NSMutableAttributedString(string: "Tap here to read the latest Football News.")
    newsString.addAttributes([NSUnderlineStyleAttributeName: NSUnderlineStyle.styleDouble.rawValue], range: NSMakeRange(4, 4))
    sampleLabel.attributedText = newsString.copy() as? NSAttributedString

    let tapGesture: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(ViewController.tapResponse))
    tapGesture.numberOfTapsRequired = 1
    sampleLabel.isUserInteractionEnabled =  true
    sampleLabel.addGestureRecognizer(tapGesture)
}

func tapResponse(recognizer: UITapGestureRecognizer) {
    print("tap")
}

0

La versione Swift ha questo aspetto:

func addGestureRecognizerLabel(){
    //Create a instance, in this case I used UITapGestureRecognizer,
    //in the docs you can see all kinds of gestures
    let gestureRecognizer = UITapGestureRecognizer()

    //Gesture configuration
    gestureRecognizer.numberOfTapsRequired = 1
    gestureRecognizer.numberOfTouchesRequired = 1
    /*Add the target (You can use UITapGestureRecognizer's init() for this)
    This method receives two arguments, a target(in this case is my ViewController) 
    and the callback, or function that you want to invoke when the user tap it view)*/
    gestureRecognizer.addTarget(self, action: "showDatePicker")

    //Add this gesture to your view, and "turn on" user interaction
    dateLabel.addGestureRecognizer(gestureRecognizer)
    dateLabel.userInteractionEnabled = true
}

//How you can see, this function is my "callback"
func showDatePicker(){
    //Your code here
    print("Hi, was clicked")
}

//To end just invoke to addGestureRecognizerLabel() when
//your viewDidLoad() method is called

override func viewDidLoad() {
    super.viewDidLoad()
    addGestureRecognizerLabel()
}

0

Personalmente preferisco il metodo di scrivere un'estensione per UILabel. Questo è quello che uso.

import UIKit

extension UILabel {
    /**
     * A map of actions, mapped as [ instanceIdentifier : action ].
     */
    private static var _tapHandlers = [String:(()->Void)]()

    /**
     * Retrieve the address for this UILabel as a String.
     */
    private func getAddressAsString() -> String {
        let addr = Unmanaged.passUnretained(self).toOpaque()
        return "\(addr)"
    }

    /**
     * Set the on tapped event for the label
     */
    func setOnTapped(_ handler: @escaping (()->Void)) {
        UILabel._tapHandlers[getAddressAsString()] = handler
        let gr = UITapGestureRecognizer(target: self, action: #selector(onTapped))
        gr.numberOfTapsRequired = 1
        self.addGestureRecognizer(gr)
        self.isUserInteractionEnabled = true
    }

    /**
     * Handle the tap event.
     */
    @objc private func onTapped() {
        UILabel._tapHandlers[self.getAddressAsString()]?()
    }
}

Dovresti quindi usarlo in questo modo da qualsiasi istanza UILabel:

myLabel.setOnTapped {
    // do something
}

Ciò può potenzialmente causare alcune perdite di memoria, credo, ma non ho ancora determinato il modo migliore per risolverle.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.