6

バックグラウンド ビューがあり、UIImageViewサブビューとして 6 があるアプリを作成しています。UITapGestureRecognizers の1 つがいつタップされたかを確認する必要があり、UIImageView以下の handleTap メソッドがジェスチャ認識エンジンによって呼び出されます。ただし、これを実行するhitTest:withEvent:と、imageViews の 1 つをタップしても常にバックグラウンド ビューが返されます。hitTest を呼び出したときのイベントと何か関係がありますか?

ありがとう

- (void) handleTap: (UITapGestureRecognizer *) sender
{
    if (sender.state == UIGestureRecognizerStateEnded)
    {
        CGPoint location = [sender locationInView: sender.view];
        UIView * viewHit = [sender.view hitTest:location withEvent:NULL];
        NSLog(@"%@", [viewHit class]);
        if (viewHit == sender.view) {}
        else if ([viewHit isKindOfClass:[UIImageView class]])
        {
            [self imageViewTapped: viewHit];
            NSLog(@"ImageViewTapped!");
        }
    }
}
4

2 に答える 2

12

UIImageViewは、デフォルトで、ユーザーインタラクションを登録しないように構成されています。

UIImageViewドキュメントから:

新しい画像ビューオブジェクトは、デフォルトでユーザーイベントを無視するように構成されています。UIImageViewのカスタムサブクラスでイベントを処理する場合は、オブジェクトを初期化した後、userInteractionEnabledプロパティの値を明示的にYESに変更する必要があります。

したがって、ビューを初期化した直後に、次のようにする必要があります。

view.userInteractionEnabled = YES;

これにより、インタラクションが再びオンになり、タッチイベントを登録できるようになります。

于 2012-04-22T21:21:30.653 に答える
1

あなたのアプローチ(含まれているビューでの単一のGR)の書き直しがありますが、座標系を正しく取得するために脳を傷つけます。これは間違いなく投稿されたコードの問題です。

より良い答えは、N 個のジェスチャ レコグナイザを各 UIImageView にアタッチすることです。それらはすべて同じターゲットを持ち、同じ handleTap: メソッドを使用できます。handleTap: は、次のようにジオメトリを検索せずにビューを取得できます。

UIImageView *viewHit = (UIImageView *)sender.view;
于 2012-04-22T21:13:02.707 に答える