UIPangestureRecognizer

UIPangestureRecognizer

我有一个可让用户在屏幕上跟踪线条的应用程序。我这样做是通过在UIPanGestureRecognizer中记录点:

-(void)handlePanFrom:(UIPanGestureRecognizer *)recognizer
{
    CGPoint pixelPos = [recognizer locationInView:rootViewController.glView];
    NSLog(@"recorded point %f,%f",pixelPos.x,pixelPos.y);
}

很好但是,我对用户在开始平移之前点击的第一点非常感兴趣。但是上面的代码仅向我提供了手势被识别为平移(相对于轻击)后发生的点。

从文档看来,似乎没有简单的方法来确定UIPanGestureRecognizer API中最初点击的位置。尽管在UIPanGestureRecognizer.h中,但我发现了以下声明:
CGPoint _firstScreenLocation;

...这似乎是私有(private)的,所以没有运气。我正在考虑完全脱离UIGestureRecognizer系统,只是为了捕获该初始点,然后在我知道用户确实已经开始使用UIPanGesture后再回头引用。我以为我会在走那条路之前先问一下。

最佳答案

晚会晚了,但是我注意到上面没有任何东西可以真正回答这个问题,实际上有一种方法可以解决这个问题。您必须将UIPanGestureRecognizer子类化,并包括:

#import <UIKit/UIGestureRecognizerSubclass.h>

可以在编写类的Objective-C文件中或Swift桥接 header 中找到。这将允许您重写touchesBegan:withEvent方法,如下所示:
class SomeCoolPanGestureRecognizer: UIPanGestureRecognizer {
    private var initialTouchLocation: CGPoint!

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent) {
        super.touchesBegan(touches, withEvent: event)
        initialTouchLocation = touches.first!.locationInView(view)
    }
}

然后,您的属性initialTouchLocation将包含您要查找的信息。当然,在我的示例中,我假设触摸集中的第一个触摸是感兴趣的触摸,如果您的maximumNumberOfTouches为1,这是有道理的。您可能希望在发现感兴趣的触摸时使用更多的技巧。

编辑: Swift 5

import UIKit.UIGestureRecognizerSubclass

class InitialPanGestureRecognizer: UIPanGestureRecognizer {
  private var initialTouchLocation: CGPoint!

  override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) {
    super.touchesBegan(touches, with: event)
    initialTouchLocation = touches.first!.location(in: view)
  }
}

关于iphone - 如何捕获最初在UIPanGestureRecognizer中点击的点?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6950713/

10-10 20:46