如何删除手势识别器

时间:2012-06-08 11:29:45

标签: iphone objective-c ios ipad ios4

所以,我正在为叠加视图添加手势识别器。当点击屏幕时,我希望这个叠加层消失。已经说过添加手势识别器会覆盖“内部触摸”和其他按钮点击事件。我需要这个,因此我需要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];    

}

这里我将覆盖图从另一个视图中删除。

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

我的问题是如何在第二种方法中删除手势识别器?我不能将变量tap传递给这个方法,也不能在之前的方法中删除它。有什么指针吗?在涉及到事件时,我一直遇到很多传递变量的问题。

10 个答案:

答案 0 :(得分:105)

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

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

答案 1 :(得分:29)

ivar

中声明UITapGestureRecognizer *tap @interface

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的方法比这个方法更优雅。

EDIT2:您似乎有[self addGestureRecognizer:tap]正在工作,所以我认为这是UIView的子类。

答案 2 :(得分:28)

WWDC 2015, Cocoa Touch Best Practices开始,建议您在以后需要访问属性或iVar时使用viewWithTag:

Moto:属性而不是标签

这可以避免一些麻烦:

  1. 处理多个手势时,您可以直接删除所需的手势并删除它。 (无需迭代所有视图的手势以获取正确的手势)
  2. 当您在迭代时通过标记找到正确的手势,如果您在视图上有多个标记,并且与特定标记发生冲突时会非常误导
  3.   

    (即)您第一次使用标签实现它,一切正常   正如所料。稍后你会研究另一种功能   打破这个并导致你不期望的不良行为。日志   不会给你一个警告,你可以得到最好的东西,具体情况是崩溃信号无法识别的选择器发送到实例有时你不会得到任何

    解决方案

    声明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];
    }
    

答案 3 :(得分:5)

只需设置叠加视图一次,设置手势识别器,但使叠加视图隐藏。隐藏视图时,它不会收到用户的任何触摸。只有在必要时才能使叠加视图显示在视图中,并在您不需要时将其隐藏。

答案 4 :(得分:5)

对于第二种方法,您的代码应该看起来更像这样:

- (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的检查,以防您的班级处理超过1 UIGestureRecognizer次而你只想删除它。

答案 5 :(得分:5)

Swift 版本:

if let recognizers = yourView.gestureRecognizers { 
  for recognizer in recognizers {
    yourView.removeGestureRecognizer(recognizer)
  }
}

答案 6 :(得分:3)

这项工作对我来说:

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

答案 7 :(得分:1)

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

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

答案 8 :(得分:1)

在Swift 4中

if let gestures = shotButton.gestureRecognizers //first be safe if gestures are there
    {
        for gesture in gestures //get one by one
        {
            shotButton.removeGestureRecognizer(gesture) //remove gesture one by one
        }
    }

答案 9 :(得分:0)

它对我有用。

bin\release