如何删除手势识别器

所以,我将一个手势识别器添加到重叠视图。 当在屏幕上点击我想要这个覆盖层走开。 话虽如此,添加一个手势识别器会覆盖“触摸里面”和其他button点击事件。 我需要这个,所以我需要removegesturerecognizer。 我可以使用这种方法,但我有一个问题。 我的代码如下 –

- (void)helpClicked { CGRect visibleBounds = [self convertRect:[self bounds] toView:viewContainer]; CGFloat minimumVisibleX = CGRectGetMinX(visibleBounds); UIImageView * helpOverlay = [[UIImageView alloc]initWithFrame:CGRectMake(minimumVisibleX, 0, 1024, 768)]; UIImage * helpImage = [UIImage imageNamed:@"HelpOverLay.png"]; [helpOverlay setImage:helpImage]; helpOverlay.tag = 50; self.scrollEnabled = NO; [self addSubview:helpOverlay]; UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissView)]; [self addGestureRecognizer:tap]; 

}

在这里,我正在从另一个angular度重叠。

 - (void) dismissView { UIView *overlay = [self viewWithTag:50]; [overlay removeFromSuperview]; self.scrollEnabled = YES; } 

我的问题是如何删除第二个方法中的手势识别器? 我不能通过可变的水龙头这个方法,也不能删除它在以前的方法。 任何指针? 事件发生时,我遇到了相当多的传递variables问题。

从WWDC 2015,Cocoa Touch最佳实践 ,build议你保留一个财产或iVar,如果你以后需要访问它,不要去使用viewWithTag:

摩托:属性而不是标签

这可以节省您的麻烦:

  1. 处理多个手势时,可以直接删除要访问该属性的手势并将其删除。 (不需要迭代所有视图的手势来获取正确的手势)
  2. 当您迭代时,通过标记find正确的手势,当您在视图上有多个标记,并且与特定标记发生冲突时,会非常具有误导性

(即)您首次使用标签实现它,并且一切按预期工作。 之后,您将开发另一个function,让它能够打破这种情况,并导致不期望的行为。 日志不会给你一个警告,最好的东西,你可以得到的情况下,这是一个崩溃信号化无法识别的select器发送到实例有时你不会得到任何这些

宣布iVar

 @implementation YourController { UITapGestureRecognizer *tap; } 

设置你的看法

 - (void) helpClicked { //Your customization code //Adding tap gesture tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissView)]; [self addGestureRecognizer:tap]; } 

直接删除手势

 - (void) dismissView { [self.view removeGestureRecognizer:tap]; } 

此循环将删除视图所具有的所有手势识别器

 for (UIGestureRecognizer *recognizer in self.view.gestureRecognizers) { [self.view removeGestureRecognizer:recognizer]; } 

在您的@interface声明一个ivar UITapGestureRecognizer *tap

更改helpClicked

 - (void)helpClicked { CGRect visibleBounds = [self convertRect:[self bounds] toView:viewContainer]; CGFloat minimumVisibleX = CGRectGetMinX(visibleBounds); UIImageView * helpOverlay = [[UIImageView alloc]initWithFrame:CGRectMake(minimumVisibleX, 0, 1024, 768)]; UIImage * helpImage = [UIImage imageNamed:@"HelpOverLay.png"]; [helpOverlay setImage:helpImage]; helpOverlay.tag = 50; self.scrollEnabled = NO; [self addSubview:helpOverlay]; tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissView)]; [self addGestureRecognizer:tap]; } 

dismissView到:

 for (UIGestureRecognizer *recognizer in self.view.gestureRecognizers) { [self removeGestureRecognizer:tap]; } 

编辑:我认为nhahtdh的方法比这个更优雅一点。

编辑2:它似乎你[self addGestureRecognizer:tap]工作,所以我想这是UIView的子类。

只需设置叠加视图一次,即可设置手势识别器,但是可以隐藏叠加视图。 当一个视图被隐藏时,它将不会收到用户的任何触摸。 只有在需要的时候才能使覆盖视图看到视图,并在不需要时隐藏视图。

你的代码应该更像这样,第二种方法:

 - (void) dismissView { UIView *overlay = [self viewWithTag:50]; for (UIGestureRecognizer *recognizer in self.view.gestureRecognizers) { if([recognizer isKindOfClass:[UITapGestureRecognizer class]]) { [self removeGestureRecognizer:recognizer]; } } [overlay removeFromSuperview]; self.scrollEnabled = YES; } 

我添加了对UITapGestureRecognizer的检查,以防您的类处理多个UIGestureRecognizer而您只想删除它。

Swift版本:

 for recognizer in yourView.gestureRecognizers! { yourView.removeGestureRecognizer(recognizer) } 

这为我工作:

 for (UIGestureRecognizer *gr in self.view.gestureRecognizers) { [self.view removeGestureRecognizer:gr]; } 

它为我工作。

 while (view.gestureRecognizers.count) { [view removeGestureRecognizer:[view.gestureRecognizers objectAtIndex:0]]; } 

如果你能够扩展视图,你可以尝试这种方式:

 _ = gestureRecognizers.flatMap { $0.map { removeGestureRecognizer($0) } }