Como tornar um UILabel clicável?

136

Eu gostaria de tornar um UILabel clicável.

Eu tentei isso, mas não funciona:

class DetailViewController: UIViewController {

    @IBOutlet weak var tripDetails: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        ...
        let tap = UITapGestureRecognizer(target: self, action: Selector("tapFunction:"))
        tripDetails.addGestureRecognizer(tap)
    }

    func tapFunction(sender:UITapGestureRecognizer) {
        print("tap working")
    }
}
Daniele B
fonte
4
Qual é o seu quadro UILabel? Tem certeza de que está tocando no quadro da etiqueta? Você tem uma UIViewscapa para o rótulo? Está userInteractionEnableddefinido Truepara o rótulo?
JAL
Verifique se o seu UILabel IBOutlet está ligado de seu Nib ou Storyboard
aahrens

Respostas:

178

Você já tentou conjunto isUserInteractionEnabledpara trueno tripDetailsrótulo? Isso deve funcionar.

Claudiu Iordache
fonte
1
obrigado pela resposta !!! Aqui eu tenho uma outra questão ainda sobre UITapGestureRecognizer: stackoverflow.com/questions/33659078/...
Daniele B
Estou tentando alterar a cor do plano de fundo na torneira, mas o evento da torneira é acionado quando solto o dedo. Existe uma maneira de capturar o evento touch down? Pressão longa não é o que estou procurando.
Numan Karaaslan
109

Atualização Swift 3

Substituir

Selector("tapFunction:")

com

#selector(DetailViewController.tapFunction)

Exemplo:

class DetailViewController: UIViewController {

    @IBOutlet weak var tripDetails: UILabel!

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

        let tap = UITapGestureRecognizer(target: self, action: #selector(DetailViewController.tapFunction))
        tripDetails.isUserInteractionEnabled = true
        tripDetails.addGestureRecognizer(tap)
    }

    @objc
    func tapFunction(sender:UITapGestureRecognizer) {
        print("tap working")
    }
}
liorco
fonte
Eu tive que anotar a função de toque com @objc.
22418 Scott S. Strader
46

Atualização SWIFT 4

 @IBOutlet weak var tripDetails: UILabel!

 override func viewDidLoad() {
    super.viewDidLoad()

    let tap = UITapGestureRecognizer(target: self, action: #selector(GameViewController.tapFunction))
    tripDetails.isUserInteractionEnabled = true
    tripDetails.addGestureRecognizer(tap)
}

@objc func tapFunction(sender:UITapGestureRecognizer) {

    print("tap working")
}
Xcodian Solangi
fonte
15

Atualização Swift 3

yourLabel.isUserInteractionEnabled = true
Indrajit Sinh Rayjada
fonte
1
isso não me ajudou. Eu estou tentando fazê-lo em uma etiqueta em um tableview
Pavlos
também funcionou aqui, mesmo que já estivesse definido no Storyboard.
brainray
14

Swift 5

Semelhante ao @liorco, mas precisa substituir o @objc pelo @IBAction .

class DetailViewController: UIViewController {

    @IBOutlet weak var tripDetails: UILabel!

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

        let tap = UITapGestureRecognizer(target: self, action: #selector(DetailViewController.tapFunction))
        tripDetails.isUserInteractionEnabled = true
        tripDetails.addGestureRecognizer(tap)
    }

    @IBAction func tapFunction(sender: UITapGestureRecognizer) {
        print("tap working")
    }
}

Isso está funcionando no Xcode 10.2.

Jerry Chong
fonte
2
@IBActioné necessário apenas para expor o método ao Interface Builder do Xcode (daí o IB). Ele também age como @objcmas, se você adicionar os gestos ou outras ações com código, deverá usar a @objcanotação #
Adam
7

Solução boa e conveniente:

No seu ViewController:

@IBOutlet weak var label: LabelButton!

override func viewDidLoad() {
    super.viewDidLoad()

    self.label.onClick = {
        // TODO
    }
}

Você pode colocar isso no seu ViewController ou em outro arquivo .swift (por exemplo, CustomView.swift):

@IBDesignable class LabelButton: UILabel {
    var onClick: () -> Void = {}
    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        onClick()
    }
}

No Storyboard, selecione Rótulo e, no painel direito, em "Identity Inspector" na classe de campo, selecione LabelButton.

Não se esqueça de ativar no Label Attribute Inspector "Interação do usuário ativada"

investigador
fonte
3

Você precisa habilitar a interação do usuário com esse rótulo .....

Por exemplo

yourLabel.userInteractionEnabled = true

Abhishek
fonte
isso não me ajudou. Eu estou tentando fazê-lo em uma etiqueta em um tableview
Pavlos
2

Para o Swift 3.0, você também pode alterar o gesto por muito tempo.

label.isUserInteractionEnabled = true
let longPress:UILongPressGestureRecognizer = UILongPressGestureRecognizer.init(target: self, action: #selector(userDragged(gesture:))) 
longPress.minimumPressDuration = 0.2
label.addGestureRecognizer(longPress)
DURGESH
fonte
1

Muito fácil esquecer como eu fiz, mas não se esqueça de usar UITapGestureRecognizer, em vez de UIGestureRecognizer.

Devbot10
fonte
-4

Conforme descrito na solução acima, você deve ativar a interação do usuário primeiro e adicionar o gesto de toque

este código foi testado usando

Swift4 - Xcode 9.2

yourlabel.isUserInteractionEnabled = true
yourlabel.addGestureRecognizer(UITapGestureRecognizer(){
                //TODO 
            })
Amr Angry
fonte
Recebo Cannot invoke initializer for type 'UITapGestureRecognizer' with an argument list of type '(() -> Void)'quando tento isso.
lionello