¿Cómo hacer que se pueda hacer clic en UILabel?

136

Me gustaría hacer que se pueda hacer clic en UILabel.

He intentado esto, pero no 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
fuente
44
¿Cuál es el marco de tu UILabel? ¿Estás seguro de que estás tocando en el marco de la etiqueta? ¿Tienes una UIViewsetiqueta que cubre? ¿Está userInteractionEnabledconfigurado Truepara la etiqueta?
JAL
Asegúrese de que su IBOutlet de UILabel esté conectado desde su Nib o Storyboard
aahrens

Respuestas:

178

¿Ha tratado de conjunto isUserInteractionEnabledde truela tripDetailsetiqueta? Esto debería funcionar.

Claudiu Iordache
fuente
1
¡¡¡gracias por la respuesta!!! Aquí todavía tengo otro problema sobre UITapGestureRecognizer: stackoverflow.com/questions/33659078/…
Daniele B
Estoy tratando de cambiar el color de fondo al tocar, pero el evento de tap se dispara cuando libero mi dedo. ¿Hay alguna manera de atrapar el evento de aterrizaje? Pulsación larga no es lo que estoy buscando.
Numan Karaaslan
109

Actualización de Swift 3

Reemplazar

Selector("tapFunction:")

con

#selector(DetailViewController.tapFunction)

Ejemplo:

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
fuente
Tuve que anotar la función tap con @objc.
Scott D. Strader
46

Actualización de 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
fuente
15

Actualización de Swift 3

yourLabel.isUserInteractionEnabled = true
Indrajit Sinh Rayjada
fuente
1
Esto no me ayudó. Estoy tratando de hacerlo en una etiqueta en una vista de tabla
Pavlos
también funcionó aquí, incluso si ya estaba configurado en el Storyboard.
brainray
14

Swift 5

Similar a @liorco, pero necesita reemplazar @objc con @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")
    }
}

Esto está funcionando en Xcode 10.2.

Jerry Chong
fuente
2
@IBActionsolo es necesario para exponer el método al Creador de interfaces de Xcode (de ahí IB). También actúa como @objcsi agregara los gestos u otras acciones con código, debería usar la @objcanotación
Adam
7

Buena y conveniente solución:

En su ViewController:

@IBOutlet weak var label: LabelButton!

override func viewDidLoad() {
    super.viewDidLoad()

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

Puede colocar esto en su ViewController o en otro archivo .swift (por ejemplo, CustomView.swift):

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

En Storyboard seleccione Label y en el panel derecho en "Identity Inspector" en la clase de campo seleccione LabelButton.

No olvide habilitar en el inspector de atributos de etiquetas "Interacción del usuario habilitada"

investigador
fuente
3

Debe habilitar la interacción del usuario de esa etiqueta .....

Por ej.

yourLabel.userInteractionEnabled = true

Abhishek
fuente
Esto no me ayudó. Estoy tratando de hacerlo en una etiqueta en una vista de tabla
Pavlos
2

Para swift 3.0 También puede cambiar la duración del tiempo de pulsación prolongada del gesto

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

Es bastante fácil pasarlo por alto como lo hice yo, pero no olvides usarlo en UITapGestureRecognizerlugar de hacerlo UIGestureRecognizer.

Devbot10
fuente
-4

Como se describe en la solución anterior, primero debe habilitar la interacción del usuario y agregar el gesto de toque

este código ha sido probado usando

Swift4 - Xcode 9.2

yourlabel.isUserInteractionEnabled = true
yourlabel.addGestureRecognizer(UITapGestureRecognizer(){
                //TODO 
            })
Amr enojado
fuente
Me sale Cannot invoke initializer for type 'UITapGestureRecognizer' with an argument list of type '(() -> Void)'cuando intento esto.
lionello