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がニブまたはストーリーボードから接続されていることを確認してください
aahrens 2015

回答:


178

ラベルに設定しようとisUserInteractionEnabledtrueましたtripDetailsか?これはうまくいくはずです。


1
答えてくれてありがとう!!! ここで私はUITapGestureRecognizerについて、まだ別の問題があります。stackoverflow.com/questions/33659078/...
ダニエルB

タップで背景色を変更しようとしていますが、指を離すとタップイベントが発生します。タッチダウンイベントをキャッチする方法はありますか?長押しは私が探しているものではありません。
Numan Karaaslan 2017

109

Swift 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
スコットD.ストレーダー

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
@IBActionXcodeのInterface Builder(したがってIB)にメソッドを公開するためにのみ必要です。それも機能し@objcますが、ジェスチャーやその他のアクションをコードで追加する場合は、@objcアノテーションを使用する必要があります
Adam

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

ストーリーボードで[ラベル]を選択し、右側のペインの[Identity Inspector]でフィールドクラスの[LabelButton]を選択します。

Label Attribute Inspectorで「User Interaction Enabled」を有効にすることを忘れないでください


3

そのラベルのユーザー操作を有効にする必要があります.....

例えば

yourLabel.userInteractionEnabled = true


これは私を助けませんでした。私はテーブルビューのラベルでそれをやろうとしています
パブロス

2

Swift 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)'これを試してみると得ます。
ライオネロ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.