Вот как я бы это сделал: создайте подкласс UISwipeGestureRecognizer
. Целью этого подкласса будет просто запомнить самые первые и последние UITouch
объекты, которые он получает в своем методе touchesBegan:withEvent:
. Все остальное будет перенаправлено на super
.
Когда ваш распознаватель запускает свое действие, распознаватель будет передан как параметр sender
. Вы можете запросить его для объектов начального и конечного касания, затем используйте метод locationInView:
и свойство timestamp
, чтобы определить скорость удара (скорость = изменение расстояния / изменение во времени).
Так что это будет примерно так:
@interface DDSwipeGestureRecognizer : UISwipeGestureRecognizer
@property (nonatomic, retain) UITouch * firstTouch;
@property (nonatomic, retain) UITouch * lastTouch;
@end
@implementation DDSwipeGestureRecognizer
@synthesize firstTouch, lastTouch;
- (void) dealloc {
[firstTouch release];
[lastTouch release];
[super dealloc];
}
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self setFirstTouch:[touches anyObject]];
[super touchesBegan:touches withEvent:event];
}
- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
[self setLastTouch:[touches anyObject]];
[super touchesEnded:touches withEvent:event];
}
@end
Тогда в другом месте вы бы сделали:
DDSwipeGestureRecognizer *swipe = [[DDSwipeGestureRecognizer alloc] init];
[swipe setTarget:self];
[swipe setAction:@selector(swiped:)];
[myView addGestureRecognizer:swipe];
[swipe release];
А ваши действия будут выглядеть примерно так:
- (void) swiped:(DDSwipeGestureRecognizer *)recognizer {
CGPoint firstPoint = [[recognizer firstTouch] locationInView:myView];
CGPoint lastPoint = [[recognizer lastTouch] locationInView:myView];
CGFloat distance = ...; // the distance between firstPoint and lastPoint
NSTimeInterval elapsedTime = [[recognizer lastTouch] timestamp] - [[recognizer firstTouch] timestamp];
CGFloat velocity = distance / elapsedTime;
NSLog(@"the velocity of the swipe was %f points per second", velocity);
}
Предупреждение: код набран в браузере и не скомпилирован. Будьте бдительны.