如何制作组合手势?

我想问一些有趣的事情。 我希望我的应用可以在自定义组合手势出现时采取行动。 例如:当用户向左,向上,向左滑动而不用手指离开屏幕时调用一个动作(/方法)。 我怎样才能做这个自定义的手势?

第二个问题是我可以滑动左上angular(如“/”这个方向)? 如何做这个手势?

任何人都可以帮助我吗? 请! 谢谢

那么,从概念上讲,您需要inheritanceUIGestureRecognizer的子类,做一些位置跟踪,并利用这样一个事实,即在导入UIGestureRecognizerSubclass.h ,手势状态属性变为可读/写,以移动您周围的所有齿轮。 举个例子,我将包括一个很久以前我尝试build立的对angular手势的基本原型。 (它需要一些扭结,但总的来说,它的工作。)

。H

 #import <UIKit/UIKit.h> #import <UIKit/UIGestureRecognizerSubclass.h> @interface MMDiagnoalSwipeGestureRecognizer : UIGestureRecognizer @property (nonatomic, readwrite) BOOL shouldReverseYDelta; @property (nonatomic, readwrite) CGFloat tolerance; @property (nonatomic, readonly) CGFloat angleOfSwipe; @end 

.M

 #import "MMDiagnoalSwipeGestureRecognizer.h" @interface MMDiagnoalSwipeGestureRecognizer () @property (nonatomic, readwrite) CGPoint startingPoint; @end @implementation MMDiagnoalSwipeGestureRecognizer - (id)initWithTarget:(id)target action:(SEL)action { self = [super initWithTarget:target action:action]; if (self) { _shouldReverseYDelta = NO; _tolerance = 30.0f; } return self; } - (CGFloat)angleOfGestureFromPoint:(CGPoint)start toEndPoint:(CGPoint)end { CGFloat deltaY = (_shouldReverseYDelta) ? end.y - start.y : start.y - end.y; CGFloat deltaX = end.x - start.x; _angleOfSwipe = atan2f(deltaY, deltaX) * 180.0f / M_PI; return _angleOfSwipe; } - (CGFloat)diagonalDistanceFromPoint:(CGPoint)start toEndPoint:(CGPoint)end { CGFloat deltaX = fabsf(start.x - end.x); CGFloat deltaY = fabsf(start.y - end.y); CGFloat hypotenuse = powf(deltaX, 2.0f) + powf(deltaY, 2.0f); return sqrtf(hypotenuse); } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { if (touches.count > 1) { if (self.state == UIGestureRecognizerStatePossible) { self.state = UIGestureRecognizerStateFailed; } }else{ [touches enumerateObjectsUsingBlock:^(id obj, BOOL *stop) { UITouch *touch = (UITouch *)obj; _startingPoint = [touch locationInView:self.view]; }]; } } - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { [touches enumerateObjectsUsingBlock:^(id obj, BOOL *stop) { UITouch *touch = (UITouch *)obj; CGPoint endPoint = [touch locationInView:self.view]; CGFloat angle = [self angleOfGestureFromPoint:_startingPoint toEndPoint:endPoint]; if (self.state == UIGestureRecognizerStatePossible) { if ([self angleIsWithinDiagonalTolerance:angle] == YES) { if ([self diagonalDistanceFromPoint:_startingPoint toEndPoint:endPoint] >= 20.0f) { self.state = UIGestureRecognizerStateRecognized; } }else{ self.state = UIGestureRecognizerStateFailed; } } }]; } - (BOOL)angleIsWithinDiagonalTolerance:(CGFloat)angle { // NSLog(@"%s",__PRETTY_FUNCTION__); NSAssert1(_tolerance < 45.0f, @"DiagonalSwipeGestureRecognizer Error: tolerance property must be set to a value less than 45.0f. Otherwise, the gesture will be detected at any angle. If you don't care and want the swipe to be recognized at any angle, remove the NSAssert call from - %s.", __PRETTY_FUNCTION__); // NSAssert(_tolerance < 45.0f, @"DiagonalSwipeGestureRecognizer Error: tolerance property must be set to a value less than 45.0f. Otherwise, the gesture will be detected at any angle. If you don't care and want the swipe to be recognized at any angle, remove the NSAssert call from -[MMDiagnoalGestureRecognizer angleIsWithinDiagonalTolerance:]."); if (angle >= 45.0f - _tolerance && angle <= 45.0f + _tolerance) { return YES; }else if (angle <= - (45.0f - _tolerance) && angle >= - (45.0f + _tolerance)) { return YES; }else if (angle >= 135.0f - _tolerance && angle <= 135.0f + _tolerance) { return YES; }else if (angle <= - (135.0f - _tolerance) && angle >= - (135.0f + _tolerance)) { return YES; }else{ return NO; } } - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { } - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { [self touchesEnded:touches withEvent:event]; self.state = UIGestureRecognizerStateChanged; } - (void)reset { //don't call, will be called automatically. } @end