UILabelをタップに応答させるには?


94

UITextFieldよりはるかに速くUILabelを作成できることを発見しました。データ表示アプリではほとんどの場合UILabelを使用する予定です。

ただし、話を短くするために、ユーザーにUILabelをタップさせて、コールバックに応答させたいと思います。それは可能ですか?

ありがとう。


1
指定する必要がありますuserInteractionEnabled = true
onmyway133

回答:


208

UITapGestureRecognizerUILabelにインスタンスを追加できます。

例えば:

UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(labelTapped)];
tapGestureRecognizer.numberOfTapsRequired = 1;
[myLabel addGestureRecognizer:tapGestureRecognizer];
myLabel.userInteractionEnabled = YES;

13
ああ、ここで 'userInteractionEnabled'プロパティが重要です(他の構成はストーリーボードで設定でき、できればそうする必要があるため)。ラベルのデフォルトでは、タッチを通過させるためにインタラクションがオフになっていますが、この場合、ジェスチャー認識機能がアクティブになるためにタッチを監視する必要があります。ありがとう!
マルキー、

1
良いですね!ラベルをタップするだけで、ユーザーインタラクションを有効にするのを完全に忘れていました。ありがとう!
Mike Critchley 2017

37

ストーリーボードを使用している場合は、追加のコードなしで、ストーリーボードでこのプロセス全体を実行できます。ストーリーボードにラベルを追加してから、ラベルにタップジェスチャーを追加します。[ユーティリティ]ペインで、ラベルの[ユーザー操作が有効]がオンになっていることを確認します。タップジェスチャー(ストーリーボードのビューコントローラーの下部)から、Ctrlキーを押しながらクリックしてViewController.hファイルにドラッグし、アクションを作成します。次に、ViewController.mファイルにアクションを実装します。


ストーリーボードなしでインターフェースビルダーのみを使用する方法
Gomino

アクセシビリティの特性だけでなく、属性インスペクタの[表示]セクションで[ユーザー操作が有効]がオンになっていることを確認します。
SeanR

17

Swift 3.0

ジェスチャーを初期化する tempLabel

tempLabel?.text = "Label"
let tapAction = UITapGestureRecognizer(target: self, action: #selector(self.actionTapped(_:)))
tempLabel?.isUserInteractionEnabled = true
tempLabel?.addGestureRecognizer(tapAction)

アクションレシーバー

func actionTapped(_ sender: UITapGestureRecognizer) {
    // code here
}

Swift 4.0

ジェスチャーを初期化する tempLabel

tempLabel?.text = "Label"
let tapAction = UITapGestureRecognizer(target: self, action:@selector(actionTapped(_:)))
tempLabel?.isUserInteractionEnabled = true
tempLabel?.addGestureRecognizer(tapAction)

アクションレシーバー

func actionTapped(_ sender: UITapGestureRecognizer) {
    // code here
}

送信者オブジェクトからラベルテキストを取得するにはどうすればよいですか?言い換えれば、送信者を識別する方法は?
Vineel 2018

Swift 4バージョンには、#selectorの代わりに@selectorがあります。
カービートッド

8

Swift 2.0:

nsmutable文字列をsampleLabelのテキストとして追加し、ユーザーインタラクションを有効にし、タップジェスチャーを追加してメソッドをトリガーしています。

override func viewDidLoad() {
    super.viewDidLoad()

    let newsString: NSMutableAttributedString = NSMutableAttributedString(string: "Tap here to read the latest Football News.")
    newsString.addAttributes([NSUnderlineStyleAttributeName: NSUnderlineStyle.StyleDouble.rawValue], range: NSMakeRange(4, 4))
    sampleLabel.attributedText = newsString.copy() as? NSAttributedString

    let tapGesture: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "tapResponse:")
    tapGesture.numberOfTapsRequired = 1
    sampleLabel.userInteractionEnabled =  true
    sampleLabel.addGestureRecognizer(tapGesture)

}
func tapResponse(recognizer: UITapGestureRecognizer) {
    print("tap")
}

4

代わりにUIButtonを使用して、テキストを必要なものに設定できます。したくない場合、ボタンはボタンのように見える必要はありません


1
それに関しては、私は常にUIButtonの左揃えの複数行テキストで問題を抱えてきました。左揃えを中央に設定しても、まだ発生します。
ハッピー

私はUIButtonを試してみましたが、それはかなりいいです。問題なのは、複数行ボタンだけです。ありがとう。
ハッピー

3

UILableにタップジェスチャーを追加するには

UITapGestureRecognizer *tapAction = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(lblClick:)];
tapAction.delegate =self;
tapAction.numberOfTapsRequired = 1;

//Enable the lable UserIntraction
lblAction.userInteractionEnabled = YES;
[lblAction addGestureRecognizer:tapAction];   

そして、セレクターメソッドを評価する

- (void)lblClick:(UITapGestureRecognizer *)tapGesture {

}

注:UIGestureRecognizerDelegateを.hファイルに追加します


2

Swiftバージョン: var tapGesture : UITapGestureRecognizer = UITapGestureRecognizer()

次にviewDidLoad()、これを追加します:

  let yourLbl=UILabel(frame: CGRectMake(x,y,width,height)) as UILabel!

    yourLbl.text = "SignUp"
    tapGesture.numberOfTapsRequired = 1
    yourLbl.addGestureRecognizer(tapGesture)
    yourLbl.userInteractionEnabled = true
    tapGesture.addTarget(self, action: "yourLblTapped:")

1

ボタンでマルチラインテキストを使用する場合は、マルチラインテキストUILabel付きのを作成し、サブビューとしてボタンに追加します。

たとえば:

yourLabel=[Uilabel alloc]init];
yourLabel.frame=yourButtom.Frame;//(frame size should be equal to your button's frame)
[yourButton addSubView:yourLabel]

1

Alvin GeorgeのSwift 3

override func viewDidLoad() {
    super.viewDidLoad()
    let newsString: NSMutableAttributedString = NSMutableAttributedString(string: "Tap here to read the latest Football News.")
    newsString.addAttributes([NSUnderlineStyleAttributeName: NSUnderlineStyle.styleDouble.rawValue], range: NSMakeRange(4, 4))
    sampleLabel.attributedText = newsString.copy() as? NSAttributedString

    let tapGesture: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(ViewController.tapResponse))
    tapGesture.numberOfTapsRequired = 1
    sampleLabel.isUserInteractionEnabled =  true
    sampleLabel.addGestureRecognizer(tapGesture)
}

func tapResponse(recognizer: UITapGestureRecognizer) {
    print("tap")
}

0

Swiftバージョンは次のようになります。

func addGestureRecognizerLabel(){
    //Create a instance, in this case I used UITapGestureRecognizer,
    //in the docs you can see all kinds of gestures
    let gestureRecognizer = UITapGestureRecognizer()

    //Gesture configuration
    gestureRecognizer.numberOfTapsRequired = 1
    gestureRecognizer.numberOfTouchesRequired = 1
    /*Add the target (You can use UITapGestureRecognizer's init() for this)
    This method receives two arguments, a target(in this case is my ViewController) 
    and the callback, or function that you want to invoke when the user tap it view)*/
    gestureRecognizer.addTarget(self, action: "showDatePicker")

    //Add this gesture to your view, and "turn on" user interaction
    dateLabel.addGestureRecognizer(gestureRecognizer)
    dateLabel.userInteractionEnabled = true
}

//How you can see, this function is my "callback"
func showDatePicker(){
    //Your code here
    print("Hi, was clicked")
}

//To end just invoke to addGestureRecognizerLabel() when
//your viewDidLoad() method is called

override func viewDidLoad() {
    super.viewDidLoad()
    addGestureRecognizerLabel()
}

0

私個人的には、UILabelの拡張機能を作成する方法を好みます。これは私が使用するものです。

import UIKit

extension UILabel {
    /**
     * A map of actions, mapped as [ instanceIdentifier : action ].
     */
    private static var _tapHandlers = [String:(()->Void)]()

    /**
     * Retrieve the address for this UILabel as a String.
     */
    private func getAddressAsString() -> String {
        let addr = Unmanaged.passUnretained(self).toOpaque()
        return "\(addr)"
    }

    /**
     * Set the on tapped event for the label
     */
    func setOnTapped(_ handler: @escaping (()->Void)) {
        UILabel._tapHandlers[getAddressAsString()] = handler
        let gr = UITapGestureRecognizer(target: self, action: #selector(onTapped))
        gr.numberOfTapsRequired = 1
        self.addGestureRecognizer(gr)
        self.isUserInteractionEnabled = true
    }

    /**
     * Handle the tap event.
     */
    @objc private func onTapped() {
        UILabel._tapHandlers[self.getAddressAsString()]?()
    }
}

次に、UILabelインスタンスから次のように使用します。

myLabel.setOnTapped {
    // do something
}

これにより、メモリリークが発生する可能性がありますが、解決方法はまだ決定していません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.