2011-09-07 89 views
5

我有一个问题,可能看起来很基本,但无法弄清楚。使UIGestureRecognizer识别失败的方法?

基本问题是:我如何以编程方式将gesturerecognizer从处理程序置于失败状态,而它处于UIGestureRecognizerStateBegan或UIGestureRecognizerStateChanged中?

更详细的解释:我有UIScrollView内的UIView长按手势识别器。我制作了

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 
    return YES; 
} 

因为否则我无法在用户将手指放在视图中时滚动视图来滚动。这是基本的触摸,如safari,您可以将手指放在链接上,突出显示链接,但向上或向下滚动 - 然后链接不显示,滚动视图移动。

由于两个手势都被识别,所以我现在可以正常工作,但是如果我可以检测到longpress gesturerecognizer的StateChanged中的移动,并且它的像素超过20像素,那么只是通过编程使longpress失败。

这可能吗?或者我挖了一个错误的地方?

回答

4

另一个问题,我找到了正确的我张贴的问题后..

下面是我在手势识别处理现在要做的:

else if (sender.state == UIGestureRecognizerStateChanged) { 
    CGPoint newTouchPoint = [sender locationInView:[self superview]]; 

    CGFloat dx = newTouchPoint.x - initTouchPoint.x; 
    CGFloat dy = newTouchPoint.y - initTouchPoint.y; 
    if (sqrt(dx*dx + dy*dy) > 25.0) { 
     sender.enabled = NO; 
     sender.enabled = YES; 
    } 
} 

因此,如果手指在任何方向移动超过25个像素,将启用属性设置为NO将使识别器失败。所以这将完成我想要的!

4

如果是UILongPressGestureRecognizer,只需设置它的allowableMovement属性。

UILongPressGestureRecognizer* recognizer = [your recognizer]; 
recognizer.allowableMovement = 25.0f; 
1

根据该文件,那么可以继承你的手势识别器:

在YourPanGestureRecognizer.m:

#import "YourPanGestureRecognizer.h" 

@implementation YourPanGestureRecognizer 

- (void) cancelGesture { 
    self.state=UIGestureRecognizerStateCancelled; 
} 

@end 

在YourPanGestureRecognizer.h:

#import <UIKit/UIKit.h> 
#import <UIKit/UIGestureRecognizerSubclass.h> 

@interface NPPanGestureRecognizer: UIPanGestureRecognizer 

- (void) cancelGesture; 

@end 

现在你可以调用如果来自任何地方

YourPanGestureRecognizer *panRecognizer = [[YourPanGestureRecognizer alloc] initWithTarget:self action:@selector(panMoved:)]; 
[self.view addGestureRecognizer:panRecognizer]; 
[...] 
-(void) panMoved:(YourPanGestureRecognizer*)sender { 
    [sender cancelGesture]; // This will be called twice 
} 

编号:https://developer.apple.com/documentation/uikit/uigesturerecognizer?language=objc