获取UITestureRecognizer的UITouch对象

有没有办法获得与手势相关联的UITouch对象? UIGestureRecognizer似乎没有任何方法。

杰的权利…你会想要一个子类。 试试这个大小,这是从我的一个项目。 在DragGestureRecognizer.h中:

 @interface DragGestureRecognizer : UILongPressGestureRecognizer { } - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; @end @protocol DragGestureRecognizerDelegate <UIGestureRecognizerDelegate> - (void) gestureRecognizer:(UIGestureRecognizer *)gr movedWithTouches:(NSSet*)touches andEvent:(UIEvent *)event; @end 

在DragGestureRecognizer.m中:

 #import "DragGestureRecognizer.h" @implementation DragGestureRecognizer - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { [super touchesMoved:touches withEvent:event]; if ([self.delegate respondsToSelector:@selector(gestureRecognizer:movedWithTouches:andEvent:)]) { [(id)self.delegate gestureRecognizer:self movedWithTouches:touches andEvent:event]; } } @end 

当然,你需要实现

 - (void) gestureRecognizer:(UIGestureRecognizer *)gr movedWithTouches:(NSSet*)touches andEvent:(UIEvent *)event; 

方法在你的委托 – 例如:

 DragGestureRecognizer * gr = [[DragGestureRecognizer alloc] initWithTarget:self action:@selector(pressed:)]; gr.minimumPressDuration = 0.15; gr.delegate = self; [self.view addGestureRecognizer:gr]; [gr release]; - (void) gestureRecognizer:(UIGestureRecognizer *)gr movedWithTouches:(NSSet*)touches andEvent:(UIEvent *)event{ UITouch * touch = [touches anyObject]; self.mTouchPoint = [touch locationInView:self.view]; self.mFingerCount = [touches count]; } 

如果它只是您感兴趣的位置,您不必子类化,就会通知您UIGestureRecognizer中的位置发生变化。

初始化目标:

 self.longPressGestureRecognizer = [[[UILongPressGestureRecognizer alloc] initWithTarget: self action: @selector(handleGesture:)] autorelease]; [self.tableView addGestureRecognizer: longPressGestureRecognizer]; 

处理UIGestureRecognizerStateChanged以获取位置更改:

 - (void)handleGesture: (UIGestureRecognizer *)theGestureRecognizer { switch (theGestureRecognizer.state) { case UIGestureRecognizerStateBegan: case UIGestureRecognizerStateChanged: { CGPoint location = [theGestureRecognizer locationInView: self.tableView]; [self infoForLocation: location]; break; } case UIGestureRecognizerStateEnded: { NSLog(@"Ended"); break; } default: break; } } 

如果您只需要查找手势的位置,则可以调用UIGestureRecognizer对象上的locationInView:或locationOfTouch:inView:。 但是,如果你想做其他任何事情,那么你需要inheritance。

如果你正在编写你自己的UIGestureRecognizer,你可以获得触摸对象覆盖:

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 

或相当于搬迁,结束或取消

苹果文档有很多关于子类的信息

这里是一个方法来获得一个长按添加到任意的UIView。

这可以让你在任何数量的UIView上运行longpress。 在这个例子中,我通过标记来限制对UIView方法的访问,但是也可以使用isKindOfClass。

(从我发现你必须使用touchesMoved LongPress,因为touchesBegan在LongPress激活之前触发)

子类 – .h

  #import <UIKit/UIKit.h> #import <UIKit/UIGestureRecognizerSubclass.h> @interface MyLongPressGestureRecognizer : UILongPressGestureRecognizer - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; @property (nonatomic) CGPoint touchPoint; @property (strong, nonatomic) UIView* touchView; @end 

子类 – .m

  #import "MyLongPress.h" @implementation MyLongPressGestureRecognizer - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; { UITouch * touch = [touches anyObject]; self.touchPoint = [touch locationInView:self.view]; self.touchView = [self.view hitTest:[touch locationInView:self.view] withEvent:event]; } #pragma mark - Setters -(void) setTouchPoint:(CGPoint)touchPoint { _touchPoint =touchPoint; } -(void) setTouchView:(UIView*)touchView { _touchView=touchView; } @end 

viewcontroller – .h

  //nothing special here 

viewcontroller – .m

  #import "ViewController.h" //LOAD #import "MyLongPress.h" @interface ViewController () //lOAD @property (strong, nonatomic) MyLongPressGestureRecognizer* longPressGesture; @end @implementation PDViewController - (void)viewDidLoad { [super viewDidLoad]; //LOAD self.longPressGesture =[[MyLongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressHandler:)]; self.longPressGesture.minimumPressDuration = 1.2; [[self view] addGestureRecognizer:self.longPressGesture]; } //LOAD -(void) setLongPressGesture:(MyLongPressGestureRecognizer *)longPressGesture { _longPressGesture = longPressGesture; } - (void)longPressHandler:(MyLongPressGestureRecognizer *)recognizer { if (self.longPressGesture.touchView.tag >= 100) /* arbitrary method for limiting tap */ { //code goes here } } 

简单而快速:

 NSArray *touches = [recognizer valueForKey:@"touches"]; 

识别器是您的UIGestureRecognizer