如何删除手势识别器
所以,我将一个手势识别器添加到重叠视图。 当在屏幕上点击我想要这个覆盖层走开。 话虽如此,添加一个手势识别器会覆盖“触摸里面”和其他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:
摩托:属性而不是标签
这可以节省您的麻烦:
- 处理多个手势时,可以直接删除要访问该属性的手势并将其删除。 (不需要迭代所有视图的手势来获取正确的手势)
- 当您迭代时,通过标记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) } }