我有一个可让用户在屏幕上跟踪线条的应用程序。我这样做是通过在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/