UITapGestureRecognizer Not Working

魚ー うおー 浜った!!

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

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

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

試してみても動かない

    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];
    }

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

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

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

    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:)]];
    }

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

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

Share on Google+Tweet about this on TwitterShare on TumblrShare on Facebook

UITapGestureRecognizer Not Working」への4件のフィードバック

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

コメントを残す

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