如何删除手势识别器

问题描述 投票:48回答:10

所以,我加入了手势识别器到覆盖视图。当屏幕上的挖掘,我想这个覆盖走开。话说回来,加入了手势识别覆盖“润色内”等按钮点击事件。我需要这回我因此需要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;
}

我的问题是我如何删除手势识别在第二种方法?我不能可变抽头通入该方法,也不能在我先前的方法或者将其删除。任何指针?我一直坚持了不少路过变量的问题,当谈到事件。

iphone objective-c ios ipad ios4
10个回答
29
投票

WWDC 2015, Cocoa Touch Best Practices,建议您保留的属性或伊瓦如果以后需要访问它,也不要使用viewWithTag:去。

摩托:属性,而不是标签

这样可以节省你一些麻烦:

  1. 当有多个手势处理,删除手势是要直接与访问属性,将其取下。 (如果没有需要遍历所有视图的姿态去移除正确的)
  2. 通过当你迭代的标签找到正确的姿态,是当你有意见上的多个标签非常误导的,并且具有与特定标签时发生冲突

(即)你实现它第一次用标签,一切都按预期工作。以后你的另一功能,这可以说打破了这种并导致意外的行为,你不要指望它的工作。登录不给你一个警告,你可以得到根据情况的最好的事情是崩溃发信号发送到实例无法识别选择。有时候,你不会得到任何的这些。

声明伊娃

@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];
}

0
投票

它为我工作。

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

106
投票

这个循环将删除所有手势识别的一种观点

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

29
投票

声明在您的ivarUITapGestureRecognizer *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]工作所以我asumming这是UIView的子类。


5
投票

刚刚成立的重叠视图一次,手势识别设置,但要隐藏覆盖图。当视图隐藏后,就不会再收到来自用户的任何联系。仅在必要时进行覆盖视图中可见的视图,并使其隐藏的,当你不需要它。


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个UIGestureRecognizers和你只是想删除。


5
投票

斯威夫特版本:

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

3
投票

这项工作对我来说:

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

1
投票

如果你能够延长的观点,你可以试试这个方法:

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

1
投票

在斯威夫特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
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.