繁体   English   中英

确定长按手势识别器的位置

[英]Determining Location of A Long Press Gesture Recognizer

目前我在四个不同的 TableViews 上有 Long Pres 手势识别器(每个 storyboard 场景中有两个,因此有两个 storyboard 场景)。 我在我的 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);

我知道为什么它不起作用,但我找不到让它起作用的解决方案。 它不是只返回一个 NSLog,而是返回四次(每个高尔夫球手一次,因为其中三个的 indexPath=nil)

任何帮助将不胜感激。 另外为什么它对 NSLog 有这样的滞后?

从识别器的 locationInView: 属性确定手势在视图中的位置:

// Get the location of the gesture
CGPoint location = [recognizer locationInView:self.view];

您可以使用识别器的接触点,

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

长按识别器应用于整个视图。 要让 NSLog 有一个“滞后”,你可以只使用 NSTimer。 获得所需结果的一种方法是使用 alpha 为零的按钮。 当他们释放时(1 秒或 120 秒),它会记录触摸。

  1. 正如 TheDeveloper 所说,长按手势是针对整个视图的。

  2. 顺便说一句,如果您要为多个视图设置手势,我相信您需要为每个视图使用一个单独的手势识别器。 这里不相关,但我看到很多人想知道为什么他们试图分配给多个视图的手势只对一个有效。

  3. 使用长按手势,我建议您检查您的 sender.state == UIGestureRecognizerStateEnded 或 Started 或您正在寻找的任何内容。 您将为一次用户交互触发多个事件。

  4. 如果你在一个视图上有手势并且你想看到,例如,如果用户在特定子视图上释放他们的手指,你可以获得释放的 CGPoint(通过 locationInView,正如 Vignesh 指出的那样),然后,您还可以获得特定子视图框架的 CGRect,然后通过 CGRectContainsPoint() 检查 CGPoint 是否在 CGRect 内。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM