UILabelでタッチイベントを処理し、IBActionにフックする


101

わかりましたのでUILabel、「開始するにはタップしてください」というデフォルトのテキストを表示するインターフェースビルダーで作成しました。

ユーザーがUILabelIをタップすると、IBActionメソッドがトリガーさ-(IBAction)next;れます。 これにより、ラベルのテキストが更新され、何か新しいことを伝えます。
これにより、接続をメソッドからラベルにドラッグし、ボタンのように内部のタッチアップを選択できるようになれば非常に便利です。残念ながら葉巻はありません。

とにかく、私の質問は、UILabelこれを機能させるためにサブクラス化する必要があるのでしょうか?または、ラベルの上にボタンをドラッグして、不透明度を0%にする方法があります。または、私が見逃しているより簡単な解決策はありますか?

回答:


255

見てみな:

UILabel *label = ...
label.userInteractionEnabled = YES;
UITapGestureRecognizer *tapGesture =
      [[UITapGestureRecognizer alloc] initWithTarget:self 
                                              action:@selector(labelTap)];
[label addGestureRecognizer:tapGesture];

トリックは、ユーザーとの対話を可能にすることです。


1
複数のラベルがある場合はどうなりますか?タップされたものをどのように区別できますか?
学習者2014

1
@learnerはtagプロパティを試します。labelTapではなく、labelTap:を使用してください。そして使用-(void)labelTap:(id)sender ;.
thedjaney 14

1
@thedjaney送信者は、UILabelではなくUITapGestureRecognizerです
h4labs

TapGestureRecognizerは内部の修正とは異なり、ヒューマンインターフェイスの適合性とアクセシビリティを失います。

1
@ h4labs UITapGestureRecognizer * tapGesture = sender;を使用できます。次に、tapGesture.view.tagでラベルタグを取得します
DJTano '18

70

UILabelは、UIResponderから継承するUIViewから継承します。すべてのUIresponderオブジェクトはタッチイベントを処理できます。したがって、ビュー(UIlabelを含む)を認識するクラスファイルには、次のように実装します。

-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event;

インターフェイスビルダーで、UILabelのタグ値を設定します。touchesBeganメソッドでタッチが発生した場合は、タグが属するビューのタグ値を確認します。

UITouch *touch = [touches anyObject];

if(touch.view.tag == MY_TAG_VAL)
label.text = @"new text";

クラスファイルのコードをインターフェイスビルダーのUILabelオブジェクトに接続するには、UILabelインスタンス変数をIBOutletプレフィックスで宣言します。

IBOutlet UILabel *label;

次に、インターフェイスビルダーでそれらを接続できます。


31
1つの注意点として、インターフェースビルダーで「ユーザー操作有効」を確認する必要があります。そうしないと機能しません。
midas06

この方法で問題が1つ見つかりました。ビューコントローラーが直接読み込まれると正常に機能しましたが、ナビゲーションコントローラーを作成し、ラベルを含むコントローラーをナビゲーションコントローラーにプッシュして表示すると、タッチがラベルに届かなくなったようです。何か案は?
midas06

それがあなたがプッシュしているのと同じビューコントローラクラスであれば、動作するはずです。他に小さな問題があるかもしれません。多分別の質問を始めて、いくつかのコードを投稿してください
リムーバー

5
タグを必要としない同様の方法は、touch.viewがラベルに設定したアウトレットと等しいかどうかを確認することです。タグを追跡する必要がないことを意味するので、私はこれを好みます。
2011年

素晴らしいソリューション。他の場所をクリックするとタグ値が0になるため、タグを0に設定しないことをお勧めします。これは、ビューのタグ値が0である可能性が高いためです。それ以外の場合は、ビューのタグを-1のようなもので、タグ値0を他の場所、つまりボタンに使用できます
kevinl

30

UIButtonを使用して、透明に、つまり画像なしのカスタムタイプにして、UILabelをその上に(中央に)追加できます。次に、通常のボタンイベントを関連付けます。


私は同意します、カスタムボタンタイプはUILabelタイプのユーザーエクスペリエンスを提供する必要があります。
stitz

2
+1、素晴らしくてシンプル。以前は、通常のボタンをopactiy 0に設定してこれを試してみましたが、機能しませんでしたが、タイプをカスタムに変更するヒントは完全に機能しました。
Brian Moeskau

不透明度はボタンとそのすべてのサブビューに影響を与えるため、opacity = 0は全体を非表示にします。
エイコ

10
うわぁ。これは、このスレッドの他のソリューションと比較したハックです。ラベルのタップジェスチャを認識する場合は、ラベルのタップジェスチャレコグナイザを使用します。(それがこのために意図されていたようにそれがどのように読むかを見てください?)
ジェームズ・バウチャー13:13の

ボタンはタップ(開始)ではなくタッチアップを処理するため、これははるかに優れたソリューションです。

17

スウィフト3

IBOutletがあります

@IBOutlet var label: UILabel!

ユーザー操作を有効にし、ジェスチャー認識機能を追加する

label.isUserInteractionEnabled = true
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(userDidTapLabel(tapGestureRecognizer:)))
label.addGestureRecognizer(tapGesture)

そして最後に、タップを処理します

func userDidTapLabel(tapGestureRecognizer: UITapGestureRecognizer) {
  // Your code goes here
}

2
これを機能させるには、@ objcをuserDidTapLabelに追加する必要がありました。迅速な4つのことかもしれません。
POSIX準拠
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.