Як зробити так, щоб його можна було натискати на UILabel?


136

Я хотів би зробити можливість переключення на UILabel.

Я спробував це, але це не працює:

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
Який кадр у вас UILabel? Ви впевнені, що торкаєтесь до рамки етикетки? Чи є у вас UIViewsобкладинка етикетки? Є чи userInteractionEnabledвстановлений Trueна етикетці?
JAL

Переконайтесь, що ваш UILabel IBOutlet підключений до вашої Nib або
дошки оголошень

Відповіді:


178

Ви спробували встановити , isUserInteractionEnabledщоб trueна tripDetailsетикетці? Це має спрацювати.


1
дякую за відповідь !!! Тут у мене є ще одне питання , до сих пір про UITapGestureRecognizer: stackoverflow.com/questions/33659078 / ...
Даніела B

Я намагаюся змінити колір тла при натисканні, але подія крана спрацьовує, коли я відпускаю палець. Чи є спосіб наздогнати подію? Тривале натискання - це не те, що я шукаю.
Numan Karaaslan

109

Швидке оновлення 3

Замініть

Selector("tapFunction:")

з

#selector(DetailViewController.tapFunction)

Приклад:

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

Мені довелося помітити функцію крана @objc.
Скотт Д. Страдер

46

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


14

Швидкий 5

Схожий на @liorco, але його потрібно замінити @objc на @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")
    }
}

Це працює над Xcode 10.2.


2
@IBActionпотрібен лише для викриття методу в Xcode's Interface Builder (звідси ІБ). Це також діє, @objcале якщо ви додасте жести чи інші дії з кодом, вам слід використовувати @objcанотацію
Адам,

7

Гарне та зручне рішення:

У вашому ViewController:

@IBOutlet weak var label: LabelButton!

override func viewDidLoad() {
    super.viewDidLoad()

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

Ви можете розмістити це у своєму ViewController або в іншому .swift-файлі (наприклад, CustomView.swift):

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

На Панелі розгортки виберіть Label (Мітка), а на правій панелі в розділі "Інспектор ідентичності" у класному полі виберіть LabelButton.

Не забудьте включити в інспекторі атрибутів міток "Включена взаємодія користувачів"


3

Потрібно ввімкнути взаємодію користувача з цією міткою .....

Наприклад, наприклад

yourLabel.userInteractionEnabled = true


це мені не допомогло. Я намагаюся зробити це на етикетці в настільному перегляді
Павлос

2

Для швидкого 3.0 Ви також можете змінити тривалий жест тривалістю натискання

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

1

Досить легко не помітити, як я, але не забудьте UITapGestureRecognizerскоріше використовувати UIGestureRecognizer.


-4

Як описано у вищезазначеному рішенні, слід спочатку ввімкнути взаємодію з користувачем та додати жест натискання

цей код протестовано за допомогою

Swift4 - Xcode 9.2

yourlabel.isUserInteractionEnabled = true
yourlabel.addGestureRecognizer(UITapGestureRecognizer(){
                //TODO 
            })

Я отримую, Cannot invoke initializer for type 'UITapGestureRecognizer' with an argument list of type '(() -> Void)'коли спробую це.
Ліонелло
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.