如何完全移除手势识别器

6

我想删除附加在UIScrollView上的三个手势识别器。

我使用以下命令列出它们:

NSArray * activeScrollViewGRecs = [theScrollView gestureRecognizers];
NSLog (@"activeScrollViewGRecs count: %d",[activeScrollViewGRecs count]);

我得到了列出的三个项目。

然后我使用以下方法将它们移除:

for (UIGestureRecognizer *recognizer in activeScrollViewGRecs)
{
    NSLog (@"recognizer: %@",recognizer.description);
    recognizer.enabled = NO;
    [theScrollView removeGestureRecognizer:recognizer];
}

然后我再次列出它们,计数为零。它们应该被删除了,对吧?那么为什么视图仍然继续响应相同的点击/滑动(手势方法被调用)?在它们彻底消失之前是否需要某种“刷新”机制?

它们是这样创建的:

tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handle1:)];
tapGesture.cancelsTouchesInView = NO; tapGesture.delaysTouchesEnded = NO; 
tapGesture.numberOfTouchesRequired = 2; tapGesture.numberOfTapsRequired = 2;     
[self.view addGestureRecognizer:tapGesture]; [tapGesture release];

swipeGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handle2:)];
swipeGesture.cancelsTouchesInView = NO; swipeGesture.delaysTouchesEnded = NO; swipeGesture.delegate = self;
swipeGesture.direction = UISwipeGestureRecognizerDirectionLeft;
[self.view addGestureRecognizer:swipeGesture]; [swipeGesture release];

thanks


你是否在那些手势方法上设置了断点以验证它们是否仍然被触发,即使你已经移除了手势? - Jeremy
好的,仍然会调用响应它们的方法。例如 - (void)handleTouchesOne:(UITapGestureRecognizer *)recognizer) ... 因此屏幕上仍然会发生一些事情。 - EarlGrey
有趣。我曾经见过这种情况发生在手势被某种方式泄露的情况下。 - Jeremy
我会确保在 for() 循环结束之前和方法结束之前,那些识别器不会被重新添加。 - Jeremy
它们并没有。我在调用手势方法之前检查了gestureRecognizers NSArray,计数为零。所以它们还没有附加到视图上,但它们仍然以某种方式起作用。如果它被调用两三次,应用程序会在其中一个方法中崩溃。就好像它不再完全活跃一样。非常奇怪的事情。 - EarlGrey
3个回答

1
为什么不使用下面的手势委托来停止任何手势:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch;

这是我正在使用的方法进行移除。现在我认为那可能是问题所在。在代理方法中间移除它们。 - EarlGrey
为什么你需要将它删除?你不能在这个函数中返回NO吗? - cocoakomali
我想我必须这样做,因为我无法正确地将它们移除。 - EarlGrey
你可以尝试另一件事情。在添加手势识别器后不要释放它。在函数 [removeGestureRecognizer:] 中使用同一个对象来移除它。 - cocoakomali

0
看起来你是将手势识别器添加到了视图上,但是从ScrollView中移除了它们。这是你想要的吗?如果你想要停止这些手势识别器,你应该从self.view中移除它们。

嗨。我正在将它们从它们所附加的同一视图中移除。我通过在移除前后检查gestureRecognizers数组来确认这一点。在移除前是3,在移除后是0。 - EarlGrey
ScrollView总是有手势识别器,但是根据你发布的代码,你添加的视图似乎不是你要从中删除的那个视图。尝试将其应用于self.view而不是theScrollView,看看是否可以解决你的问题。 - Philippe Sabourin

0
采用 UIGestureRecognizerDelegate 协议并实现以下方法。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    if (to completely remove gesture recognizers)
        return NO;
    else 
        return YES;
}

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