カテゴリー
diary

UITapGestureRecognizer Not Working

魚ー うおー 浜った!!

iOSでラベル(UILabel)にタップ認識(UITapGestureRecognizer)を追加しようとして

検索するとだいたいラベルのuserInteractionEnabledをYESにしろっていうのが出てくる。そんなの知ってるC。。。素人じゃあるまいし。素人だけど

で、最初に書いてたコードがこれ。1~3までの回答が書かれたラベルエリアがあって、誤った回答をタップするとaddGestureRecognizerした処理が実行されたい、という意図

試してみても動かない

[cpp]
UITapGestureRecognizer *wrongAnswerRecognizer = [[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(wrongAnswer:)];
wrongAnswerRecognizer.numberOfTapsRequired = 1;

int correct_answer = [[self.entity valueForKey:@"correct_answer"] integerValue];
if (correct_answer == 1) {
[label2 addGestureRecognizer:wrongAnswerRecognizer];
[label3 addGestureRecognizer:wrongAnswerRecognizer];
} else if (correct_answer == 2) {
[label1 addGestureRecognizer:wrongAnswerRecognizer];
[label3 addGestureRecognizer:wrongAnswerRecognizer];
} else if (correct_answer == 3) {
[label1 addGestureRecognizer:wrongAnswerRecognizer];
[label2 addGestureRecognizer:wrongAnswerRecognizer];
}
[/cpp]

この間にいろんなヘンな事を試すわけです。ラベルの境界線が重なりあって、タップが認識されていないのでは?って疑ってボーダー出してみてラベルの大きさとか位置とか確認したり。もしかしてラベルの下のビュー(superview)のuserInteractionEnableもYESにしないとダメなの?とか。結局イライラして画面連打してたら、3番目の回答をタップしたら処理が実行された!!

デバッグ中の画面の正解回答は2番。ずっとデバッグで1番の不正解ばかり確認してたのでした

そして、修正したコードがこちら

[cpp]
int correct_answer = [[self.entity valueForKey:@"correct_answer"] integerValue];
if (correct_answer == 1) {
[label2 addGestureRecognizer:[[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(wrongAnswer:)]];
[label3 addGestureRecognizer:[[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(wrongAnswer:)]];
} else if (correct_answer == 2) {
[label1 addGestureRecognizer:[[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(wrongAnswer:)]];
[label3 addGestureRecognizer:[[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(wrongAnswer:)]];
} else if (correct_answer == 3) {
[label1 addGestureRecognizer:[[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(wrongAnswer:)]];
[label2 addGestureRecognizer:[[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(wrongAnswer:)]];
}
[/cpp]

同じインスタンスを複数のラベルに指定すると、どうやら後から追加した方にもっていかれるようです。そんなもんで、タップ認識オブジェクト(UITapGestureRecognizer)は必ずView毎にインスタンス化する必要があるようです

知っていれば当然のような事に見えるけど、知らないとハマるかもしれないようなシチュエーション。意外とこういう地味な事に数時間費やしちゃう場合とかある

「UITapGestureRecognizer Not Working」への4件の返信

あざまーっすw まだ色々あるんでハマータイム!!

もしかしてと思い、「UIGestureRecognizer 複数」で検索したら
ここに来ました。ありがとう。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です