Вот подкласс, который, кажется, работает.Он задерживает состояние «начало» до тех пор, пока не будет достигнуто желаемое расстояние.
DelayedPanGestureRecognizer.h:
#import <UIKit/UIKit.h>
@interface DelayedPanGestureRecognizer : UIPanGestureRecognizer
@property (nonatomic, assign) CGFloat delay;
@end
DelayedPanGestureRecognizer.m:
#import "DelayedPanGestureRecognizer.h"
#import <UIKit/UIGestureRecognizerSubclass.h>
@implementation DelayedPanGestureRecognizer
- (void)setState:(UIGestureRecognizerState)state {
if (state == UIGestureRecognizerStateBegan) {
CGPoint trans = [self translationInView:self.view];
if (trans.x * trans.x + trans.y * trans.y > self.delay * self.delay) {
[super setState:state];
}
} else {
[super setState:state];
}
}
@end
Использование:
DelayedPanGestureRecognizer *pan = [[DelayedPanGestureRecognizer alloc] initWithTarget:self action:@selector(panned:)];
pan.delay = 6;
[someView addGestureRecognizer:pan];
И действие:
- (void)panned:(DelayedPanGestureRecognizer *)gesture {
NSLog(@"State: %d", (int)gesture.state);
NSLog(@"%@", NSStringFromCGPoint([gesture translationInView:gesture.view]));
if (gesture.state == UIGestureStateBegan) {
// do something
} else if (gesture.state == UIGestureStateChanged) {
// do other things
}
}