10

現在、4つの異なるTableViewにLong Pres Gesture Recognizersがあります(各ストーリーボードシーンに2つ、したがって2つのストーリーボードシーン)。ViewDidLoadメソッドで次のコードを使用してこれらのLPGRを作成します...

//Add Long Press Gesture Reconizer
UILongPressGestureRecognizer *lpgr = [[UILongPressGestureRecognizer alloc] 
                                      initWithTarget:self action:@selector(handleLongPress:)];
lpgr.minimumPressDuration = 1; //seconds
lpgr.delegate = self;
[self.GolferOne addGestureRecognizer:lpgr];
[self.GolferTwo addGestureRecognizer:lpgr];
[self.GolferThree addGestureRecognizer:lpgr];
[self.GolferFour addGestureRecognizer:lpgr];
//Done Adding Long Press Gesture Reconizer

次に、LPGが押された場所でNSLogを実行したい別のメソッドがあります...

CGPoint p = [gestureRecognizer locationInView:self.GolferOne];

   NSIndexPath *indexPath = [self.GolferOne indexPathForRowAtPoint:p];
    if (indexPath == nil)
        NSLog(@"long press on table view but not on a row [Golfer One]");
    else
        NSLog(@"long press on table view at row %d [Golfer One]", indexPath.row);

    //Golfer Two

    p = [gestureRecognizer locationInView:self.GolferTwo];

    indexPath = [self.GolferTwo indexPathForRowAtPoint:p];
    if (indexPath == nil)
        NSLog(@"long press on table view but not on a row [Golfer Two]");
    else
        NSLog(@"long press on table view at row %d [Golfer Two]", indexPath.row);

    //Golfer Three

    p = [gestureRecognizer locationInView:self.GolferThree];

    indexPath = [self.GolferThree indexPathForRowAtPoint:p];
    if (indexPath == nil)
        NSLog(@"long press on table view but not on a row [Golfer Three]");
    else
        NSLog(@"long press on table view at row %d [Golfer Three]", indexPath.row);

    //Golfer Four

    p = [gestureRecognizer locationInView:self.GolferFour];

    indexPath = [self.GolferFour indexPathForRowAtPoint:p];
    if (indexPath == nil)
        NSLog(@"long press on table view but not on a row [Golfer Four]");
    else
        NSLog(@"long press on table view at row %d [Golfer Four]", indexPath.row);

なぜ機能しないのかはわかりますが、機能させるための解決策を見つけることができません。1つのNSLogを再取得する代わりに、4回何かを返します(3人がindexPath = nilであるため、ゴルファーごとに1回)

どんな助けでもありがたいです。また、なぜNSLogにそのような遅れがあるのですか?

4

4 に答える 4

9

レコグナイザの locationInView: プロパティからビュー内のジェスチャの位置を特定するには:

// Get the location of the gesture
CGPoint location = [recognizer locationInView:self.view];
于 2013-08-23T18:02:23.257 に答える
6

を使用して、認識機能のタッチポイントを取得できます。

 -(void)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer
{
 NSLog(@"%@",NSStringFromCGPoint([[gestureRecognizer valueForKey:@"_startPointScreen"] CGPointValue]));

}

レコグナイザーが追加された座標系に関するポイントが得られます。

あなたのレコグナイザーは最後のゴルファーにのみ登録されています。あなたはこれをすべきです、

UILongPressGestureRecognizer *lpgr = [[UILongPressGestureRecognizer alloc] 
                                      initWithTarget:self action:@selector(handleLongPress:)];
lpgr.minimumPressDuration = 1; //seconds
[self.GolferOne addGestureRecognizer:lpgr];
[lgpr release];
lpgr = [[UILongPressGestureRecognizer alloc] 
                                      initWithTarget:self action:@selector(handleLongPress:)];
lpgr.minimumPressDuration = 1; //seconds

[self.GolferTwo addGestureRecognizer:lpgr];
[lgpr release];
于 2012-04-05T02:50:35.410 に答える
0
  1. TheDeveloper が言ったように、長押しジェスチャーはビュー全体に対するものです。

  2. 余談ですが、複数のビューにジェスチャを設定する場合は、ビューごとに個別のジェスチャ レコグナイザが必要になると思います。ここでは関係ありませんが、複数のビューに割り当てようとしたジェスチャがなぜ 1 つのビューでしか機能しないのか疑問に思っている人がたくさんいます。

  3. 長押しジェスチャでは、sender.state == UIGestureRecognizerStateEnded または Started または探しているものを確認することをお勧めします。1 回のユーザー インタラクションに対して複数のイベントがトリガーされます。

  4. ビューでジェスチャを取得していて、たとえば、ユーザーが特定のサブビューで指を離したかどうかを確認したい場合は、(Vignesh が指摘したように、locationInView を介して)リリースの CGPoint を取得できます。次に、特定のサブビューのフレームの CGRect を取得し、CGRectContainsPoint() を介して CGPoint が CGRect 内にあるかどうかを確認することもできます。

于 2012-04-05T03:05:08.877 に答える
0

Long press recognizer is applied to the entire view. To have a 'lag' with NSLog you can just use NSTimer. A way you could get a result like your want is buttons with alpha of zero. When they release (be it 1 seconds or 120) it would log the touch.

于 2012-04-05T02:05:27.297 に答える