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

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.


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

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

15

Actualización de Swift 3

yourLabel.isUserInteractionEnabled = true

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.


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"


3

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

Por ej.

yourLabel.userInteractionEnabled = true


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)

1

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


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

Me sale Cannot invoke initializer for type 'UITapGestureRecognizer' with an argument list of type '(() -> Void)'cuando intento esto.
lionello
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.