web-dev-qa-db-ja.com

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

[OK]ので、インターフェイスビルダーでUILabelを作成し、「タップして開始」というデフォルトテキストを表示します。

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

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

100
wfbarksdale

見てみな:

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

秘trickは、ユーザーとの対話を可能にすることです。

253
Scott Persinger

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";

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

IBOutlet UILabel *label;

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

70
Remover

UIButtonを使用して、透明にする、つまり画像のないカスタムタイプを作成し、その上にUILabelを追加できます(中央揃え)。次に、通常のボタンイベントを接続します。

30
Eiko

Swift

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
}
16
César Cruz