web-dev-qa-db-ja.com

タップジェスチャーレコグナイザー-どのオブジェクトがタップされましたか?

私はジェスチャレコグナイザーが初めてなので、この質問はばかげているようです。タップジェスチャレコグナイザーを一連のUIViewに割り当てています。メソッドでは、それらのどれが何らかの方法でタップされたかを見つけることは可能ですか、または画面上でタップされたポイントを使用してそれを見つける必要がありますか?

for (NSUInteger i=0; i<42; i++) {
        float xMultiplier=(i)%6;
        float yMultiplier= (i)/6;
        float xPos=xMultiplier*imageWidth;
        float yPos=1+UA_TOP_WHITE+UA_TOP_BAR_HEIGHT+yMultiplier*imageHeight;
        UIView *greyRect=[[UIView alloc]initWithFrame:CGRectMake(xPos, yPos, imageWidth, imageHeight)];
        [greyRect setBackgroundColor:UA_NAV_CTRL_COLOR];

        greyRect.layer.borderColor=[UA_NAV_BAR_COLOR CGColor];
        greyRect.layer.borderWidth=1.0f;
        greyRect.userInteractionEnabled=YES;
        [greyGridArray addObject:greyRect];
        [self.view addSubview:greyRect];
        NSLog(@"greyGrid: %i: %@", i, greyRect);

        //make them touchable
        UITapGestureRecognizer *letterTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(highlightLetter)];
        letterTapRecognizer.numberOfTapsRequired = 1;
        [greyRect addGestureRecognizer:letterTapRecognizer];
    }
50
suMi

引数としてターゲットセレクター(highlightLetter:)を定義します。

UITapGestureRecognizer *letterTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(highlightLetter:)];

その後、次の方法でビューを取得できます

- (void)highlightLetter:(UITapGestureRecognizer*)sender {
     UIView *view = sender.view; 
     NSLog(@"%d", view.tag);//By tag, you can find out where you had tapped. 
}
111
Mani

この質問をするのは1年でしたが、まだ誰かのためです。

特定のビューでUITapGestureRecognizerを宣言しながら、タグを

UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(gestureHandlerMethod:)];
[yourGestureEnableView addGestureRecognizer:tapRecognizer];
yourGestureEnableView.tag=2;

そしてあなたのハンドラーでこのようにします

-(void)gestureHandlerMethod:(UITapGestureRecognizer*)sender {
    if(sender.view.tag == 2) {
        // do something here
    }
}
15

以下はSwift 3の更新とManiの答えへの追加です。多少「高度な」アプローチのために、sender.viewをUIViews(または追跡しようとしているものに応じて他の要素)のタグ付けと組み合わせて使用​​することをお勧めします。

  1. UITapGestureRecognizerの追加UIButton(これをUIViewsなどに追加することもできます)またはforループとタップジェスチャ用の2番目の配列を持つ配列内のアイテム全体。
    let yourTapEvent = UITapGestureRecognizer(target: self, action: #selector(yourController.yourFunction)) 
    yourObject.addGestureRecognizer(yourTapEvent) // adding the gesture to your object
  1. 同じtestControllerで関数を定義します(View Controllerの名前です)。ここでは tags を使用します-タグはInt IDであり、yourButton.tag = 1を使用してUIViewに追加できます。配列のような要素の動的リストがある場合、forループを作成して、配列を反復処理し、タグを追加します。

    func yourFunction(_ sender: AnyObject) {
        let yourTag = sender.view!.tag // this is the tag of your gesture's object
        // do whatever you want from here :) e.g. if you have an array of buttons instead of just 1:
        for button in buttonsArray {
          if(button.tag == yourTag) {
            // do something with your button
          }
        }
    }
    

このすべての理由は、#selectorと組み合わせて使用​​する場合、yourFunctionにさらに引数を渡すことができないためです。

さらに複雑なUI構造があり、タップジェスチャに添付されたアイテムの親のタグを取得する場合は、let yourAdvancedTag = sender.view!.superview?.tagを使用できます。 UIView内の押されたボタンのUIViewのタグを取得します。サムネイル+ボタンリストなどに役立ちます。

8
tech4242

Swiftでこのコードを使用します

func tappGeastureAction(sender: AnyObject) {
    if let tap = sender as? UITapGestureRecognizer {
        let point = tap.locationInView(locatedView)
        if filterView.pointInside(point, withEvent: nil) == true {
            // write your stuff here                
        }
    }
}
4
Phani Sai

使用できます

 - (void)highlightLetter:(UITapGestureRecognizer*)sender {
     UIView *view = sender.view; 
     NSLog(@"%d", view.tag); 
}

ビューはタップジェスチャが認識されたオブジェクトになります

2
Bonnie

UIGestureRecognizerの「shouldReceiveTouch」メソッドを使用することもできます

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:     (UITouch *)touch {
     UIView *view = touch.view; 
     NSLog(@"%d", view.tag); 
}    

ジェスチャ認識エンジンのデリゲートを設定することを忘れないでください。

2
Fawad Masud

Swiftそれは非常に単純です

ViewDidLoad()関数でこのコードを記述します

let tap = UITapGestureRecognizer(target: self, action: #selector(tapHandler(gesture:)))
    tap.numberOfTapsRequired = 2
    tapView.addGestureRecognizer(tap)

ハンドラー部分は、viewDidLoadまたはviewDidLoadの外部にある場合があり、バッターは拡張機能に配置されます

@objc func tapHandler(gesture: UITapGestureRecognizer) {
    currentGestureStates.text = "Double Tap"
} 

ここでは、あなたがやりたいことを実行したり、もっと練習して読んだりすることができるアクションを行いたい場合は、出力を印刷してコードをテストしています

2
Dilip Tilonia

パラメーターを受け入れるようにジェスチャレコグナイザーの作成を修正する必要があります(コロン ':'を追加)

UITapGestureRecognizer *letterTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(highlightLetter:)];

そして、メソッドhighlightLetterで:認識に添付されたビューにアクセスできます:

-(IBAction) highlightLetter:(UITapGestureRecognizer*)recognizer
{
    UIView *view = [recognizer view];
}
1
Greg

異なるUIGestureRecognizerを異なるUIViewsに追加していて、アクションメソッドで区別したい場合は、senderパラメーターでプロパティビューを確認して、送信者ビューを確認できます。

0
ahmedalkaff
func tabGesture_Call
{
     let tapRec = UITapGestureRecognizer(target: self, action: "handleTap:")
     tapRec.delegate = self
     self.view.addGestureRecognizer(tapRec)
     //where we want to gesture like: view, label etc
}

func handleTap(sender: UITapGestureRecognizer) 
{
     NSLog("Touch..");
     //handling code
}
0
Manjeet