UIPinchGestureRecognizer仅用于捏出

我试图创build一个UIPinchGestureRecognizer失败,如果用户捏(移动手指分开)。 我知道有一个非常简单的方法来做到这一点,只是采取行动方法的识别器的规模,如果它大于1,设置一个标志,并忽略所有未来的呼叫。 然而,这不适用于我,我有其他的手势识别器,需要这个捏认识失败,所以我需要它正确地失败时,用户捏在错误的方向。

我试图inheritanceUIPinchGestureRecognizer:

@implementation BHDetailPinchGestureRecogniser { CGFloat initialDistance; } #pragma mark - Object Lifecycle Methods - (id)initWithTarget:(id)target action:(SEL)action { self = [super initWithTarget:target action:action]; if (self) { initialDistance = NSNotFound; } return self; } #pragma mark - UIGestureRecogniser Methods - (BOOL)shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)recogniser { if ([recogniser isKindOfClass:[UIPinchGestureRecognizer class]]) { return [self.delegate gestureRecognizerShouldBegin:self]; } else return false; } - (void)reset { [super reset]; initialDistance = NSNotFound; } #pragma mark - Touch Handling Methods - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { if (touches.count >= 2) { if (self.state == UIGestureRecognizerStatePossible) { // Keep hold of the distance between the touches NSArray *bothTouches = [touches allObjects]; CGPoint location1 = [(UITouch *)bothTouches[0] locationInView:self.view]; CGPoint location2 = [(UITouch *)bothTouches[1] locationInView:self.view]; initialDistance = [self distanceBetweenPoint:location1 andPoint:location2]; } } else { // Fail if there is only one touch self.state = UIGestureRecognizerStateFailed; } } - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { NSLog(@"Moved. (tc, %lu) (state, %i) (id, %f)", (unsigned long)touches.count, self.state, initialDistance); if (touches.count >= 2) { if (self.state == UIGestureRecognizerStatePossible) { if (initialDistance != NSNotFound) { // Get the new distance and see if is is larger or smaller than the original NSArray *bothTouches = [touches allObjects]; CGPoint location1 = [(UITouch *)bothTouches[0] locationInView:self.view]; CGPoint location2 = [(UITouch *)bothTouches[1] locationInView:self.view]; NSLog(@"Checking distance between points."); if ([self distanceBetweenPoint:location1 andPoint:location2] < initialDistance - 3.f) { NSLog(@"Began"); self.state = UIGestureRecognizerStateBegan; } else if ([self distanceBetweenPoint:location1 andPoint:location2] > initialDistance) { NSLog(@"Failed"); self.state = UIGestureRecognizerStateFailed; } } } else { self.state = UIGestureRecognizerStateChanged; } } } - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { if (self.state == UIGestureRecognizerStatePossible) self.state = UIGestureRecognizerStateFailed; else [super touchesEnded:touches withEvent:event]; } - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { self.state = UIGestureRecognizerStateCancelled; } #pragma mark - Helper Methods - (CGFloat)distanceBetweenPoint:(CGPoint)point1 andPoint:(CGPoint)point2 { return sqrtf(powf(point1.x - point2.x, 2) + powf(point1.y - point2.y, 2)); } @end 

我已经意识到,并不是那么简单,它需要处理多重触动,有时触动只有一个触动,所以需要保持触动,一触即可,另一个开始,这仍然是想捏的一部分。 这似乎是我失去了夹捏识别器的function构build时,我想要做的就是如果用户捏在错误的方向使其失败。

有没有一个简单的方法来实现这种行为,而不是完全重写UIPinchGestureRecognizer? 可能值得一提的是,我无法控制我想失败的其他识别器(它们深入到PSPDFViewController(第三方库)的碗中)。

如何使用手势识别器的delegate来帮助?

使用以下执行的gestureRecognizerShouldBegin设置一个委托

 func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool { if let pinch = gestureRecognizer as? UIPinchGestureRecognizer { return pinch.scale < 1 } return true }