所以,我正在为叠加视图添加手势识别器。当点击屏幕时,我希望这个叠加层消失。已经说过添加手势识别器会覆盖“内部触摸”和其他按钮点击事件。我需要这个,因此我需要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传递给这个方法,也不能在之前的方法中删除它。有什么指针吗?在涉及到事件时,我一直遇到很多传递变量的问题。
答案 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:
。
这可以避免一些麻烦:
(即)您第一次使用标签实现它,一切正常 正如所料。稍后你会研究另一种功能 打破这个并导致你不期望的不良行为。日志 不会给你一个警告,你可以得到最好的东西,具体情况是崩溃信号无法识别的选择器发送到实例。 有时你不会得到任何。
声明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