有时在 UIGestureRecognizer 处理程序后未触发 IBAction

Posted

技术标签:

【中文标题】有时在 UIGestureRecognizer 处理程序后未触发 IBAction【英文标题】:IBAction not fired sometimes after UIGestureRecognizer handler 【发布时间】:2015-07-20 12:13:26 【问题描述】:

我正在尝试使用UIGestureRecognizer 跟踪对 UI 元素的点击(点击和长按)。在跟踪命中后(假设通过NSLog 记录)UI 元素应该可以完成它的工作。

我正在创建这样的手势识别器:

UITapGestureRecognizer* tap = [[UITapGestureRecognizer] alloc initWithTarget:self action:(OnGesture:)]
tap.cancelsTouchesInView = NO;
tap.delegate = self;
[view addGestureRecognizer:tap];

UILongPressGestureRecognizer* longPress = [[UILongPressGestureRecognizer] alloc initWithTarget:self action:(OnGesture:)]
longPress.cancelsTouchesInView = NO;
longPress.delegate = self;
[view addGestureRecognizer:longPress];

我已经覆盖了一些手势识别器方法:

-(BOOL)gestureRecognizer:(UIGestureRecognizer*)_recognizer shouldReceiveTouch(UITouch*)_touch

    return YES;

-(BOOL)gestureRecognizer:(UIGestureRecognizer*)_recognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer*)_otherRecognizer

    return YES;

在手势识别器处理程序中,我试图通过使用hitTest 方法找到点击的确切子视图。

-(void)OnGesture:(UIGestureRecognizer*)_recognizer

    if([_recognizer.state == UIGestureRecognizerStateEnded])
    
        if([_recognizer isKindOfClass:[UITapGestureRecognizer class]]
            || [_recognizer isKindOfClass:[UILongPressGestureRecognizer class])
        
            CGPoint location = [_recognizer locationOfTouch:0 inView:_recognizer.view];                

            // my problem occurs here:
            //---------------------------------------------------------------------------
            UIView* hitView = [_recognizer.view hitTest:location withEvent:nil];
            //---------------------------------------------------------------------------
            
             NSLog(@"Hit on view: %@", hitView);
         
    


所以我的问题是:

有时(十分之一)当我按下 UIButton OnGesture 方法时会触发,但该按钮的“Touch Up Inside”事件的 IBAction 不会触发。


但是当我注释掉hitTest 时:

//UIView* hitView = [_recognizer.view hitTest:location withEvent:nil];

该错误不再可重现。 IBAction 总是被调用。


为什么会这样?我该如何解决这个问题?

附:上面的示例代码中可能有一些拼写错误。

【问题讨论】:

【参考方案1】:

根据docs,为了让它工作:

此方法会忽略隐藏、禁用用户交互或 alpha 级别小于 0.01 的视图对象。此方法在确定命中时不考虑视图的内容。因此,即使指定点位于视图内容的透明部分中,仍然可以返回视图。

所以你可能想做self.someSubview.userInteractionEnabled = YES;

【讨论】:

以上是关于有时在 UIGestureRecognizer 处理程序后未触发 IBAction的主要内容,如果未能解决你的问题,请参考以下文章

UIGestureRecognizer

UIGestureRecognizer

UIGestureRecognizer 在屏幕外渲染

UIGestureRecognizer 目标问题

`UIGestureRecognizer`命中测试

UITableViewCell 内的 UIView 上的 UIGestureRecognizer