无法识别UITapGestureRecognizer,因为视图嵌套在多个视图中

时间:2018-12-06 18:18:03

标签: ios objective-c uiview uitapgesturerecognizer

我有一个自定义视图,通过单击视图控制器上的按钮或单击表视图单元格(表视图是视图控制器的子级)上的按钮来呈现

要关闭自定义视图,我希望用户能够点击屏幕上的任意位置以将其关闭。但是,由于视图控制器中视图的层次结构很多。一个简单的UITapGuestureRecognizer无法正常工作。这样的情况有解决方法吗?

1 个答案:

答案 0 :(得分:1)

创建UIView的子类,将其命名为MyTapView。向此类分配父视图,该视图包含所有子视图。 在您的课程中重写以下内容,以拦截对您的view实例的任何触摸。

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    if (!self.clipsToBounds && !self.hidden && self.alpha > 0) {
        for (UIView *subview in self.subviews.reverseObjectEnumerator) {
            CGPoint subPoint = [subview convertPoint:point fromView:self];
            UIView *result = [subview hitTest:subPoint withEvent:event];
            if (result != nil) {
                return result;
            }
        }
    }
    // use this to pass the 'touch' onward in case no subviews trigger the touch
    return [super hitTest:point withEvent:event];
}

此方法将忽略隐藏的视图对象,禁用的用户交互或alpha级别小于0.01的视图对象。确定点击次数时,该方法不会考虑视图的内容(可以随意修改)。因此,即使指定点位于该视图内容的透明部分中,该视图仍然可以返回,现在,在覆盖该视图之后,它会接收超出范围的触摸。