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")
    }
}

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.


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")
    }
}

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")
}

15

Atualização Swift 3

yourLabel.isUserInteractionEnabled = true

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.


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"


3

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

Por exemplo

yourLabel.userInteractionEnabled = true


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)

1

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


-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 
            })

Recebo Cannot invoke initializer for type 'UITapGestureRecognizer' with an argument list of type '(() -> Void)'quando tento isso.
lionello
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.