如何在物体移动到某个特定框架时停止UIPanGestureRecognizer?

16
我有一个图像对象,正在使用UIPanGestureRecognizer移动它。当对象到达特定帧时,我需要停止识别UIPanGestureRecognizer。
    UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(move:)];
    [panRecognizer setMinimumNumberOfTouches:1];
    [panRecognizer setMaximumNumberOfTouches:1];
    [panRecognizer setDelegate:self];
    [templatePhotoPlaceholderView addGestureRecognizer:panRecognizer];

-(void)move:(UIPanGestureRecognizer *)gestureRecognizer
{
    CGPoint translatedPoint = [gestureRecognizer translationInView:templatePhotoPlaceholderView];

    if([gestureRecognizer state] == UIGestureRecognizerStateBegan) {
        _firstX = [imageview center].x;
        _firstY = [imageview center].y;
    }



    translatedPoint = CGPointMake(_firstX+translatedPoint.x, _firstY+translatedPoint.y);
    //NSLog(@" Move center point :%@", NSStringFromCGPoint(translatedPoint));

    [imageview setCenter:translatedPoint];  

}

我该如何做到这一点?

3个回答

23

UIGestureRecognizers有一个enabled属性。文档:

禁用手势识别器,使其无法接收触摸。默认值为YES。如果在手势识别器当前正在识别手势时将此属性更改为NO,则手势识别器将转换为已取消状态。

编辑:

只需将enabled属性设置为NO即可。

gestureRecognizer.enabled = NO;

2
嗨,jbat。你能给我一些停止UIGestureRecognizers的行代码示例吗? - user905582

17

如果您需要停止UIPanGestureRecognizer识别手势,则只需将以下代码行(如jbat100所说)放在-(void)move:(UIPanGestureRecognizer *)gestureRecognizer中:

gestureRecognizer.enabled = NO;

在这行代码之后,您的手势识别器状态将设置为 "UIGestureRecognizerStateCancelled"

然后只需在您的 -(void)move:(UIPanGestureRecognizer *)gestureRecognizer 函数中添加几行:

if ([gestureRecognizer state] == UIGestureRecognizerStateCancelled) {
     gestureRecognizer.enabled = YES;
}

你将能够使用手势识别器进行工作。

编辑

这是代码片段:

- (void)move:(UIPanGestureRecognizer *)gestureRecognizer {
    BOOL cancelPanGesture = YES;
    if (cancelPanGesture) {
        /* 
         After this line gesture recognizer will be disabled, state will be UIGestureRecognizerStateCancelled
         and this method (move:) will fire one more time.
         */
        gestureRecognizer.enabled = NO;
    }
    if (gestureRecognizer.state == UIGestureRecognizerStateCancelled) {
        gestureRecognizer.enabled = YES;
    }
}

1
回答不太清楚gestureRecognizer.enabled = YES;应该写在哪里。如果您能详细说明,那将更有意义。 - rohan-patel
2
我喜欢这个。它将识别器的状态封装在该函数中,而不是在代码中放置愚蠢的“shouldCancelPan”实例变量。 - John Nesbitt
使用这种技术,当我到达某个点并设置recogniser.enabled = false时,它会进入取消状态,然后我再次启用它,但手势直到我抬起手指并重新开始才会开始。 - Pranav Gupta

5

设置pangesture.delegate=self,并实现代理方法

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
     //return NO when you reach the frame
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接