如何让兄弟UIViews处理不同的手势?

时间:2014-03-07 19:11:49

标签: ios uigesturerecognizer siblings

我有一个UIView,它有两个子视图,一个是UIScrollView,另一个是其他一些子视图的容器视图。容器视图完全覆盖滚动视图。

需要处理手势的视图:

  • UIScrollView - 应处理默认的捏合和平移手势
  • 容器视图 - 无
  • 容器视图子视图 - 应处理轻击手势

现在为了通过容器视图子视图处理轻击手势,我为容器视图实现了pointInside:withEvent :.如果它识别出该点在其子视图中,则返回YES。这很好用。问题是,当我捏​​或平移时,我的手指最初触摸其中一个容器视图子视图,它不起作用。当我在容器视图的空白区域上捏或平移时,它可以正常工作。

有关如何使其发挥作用的任何建议吗?

修改

我已经为主视图实现了hitTest:withEvent:并且得到了相同的行为。

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    UIView *hitTestView;

    for (UIView *subview in [self.subviews reverseObjectEnumerator])
    {
        hitTestView = [subview hitTest:[self convertPoint:point
                                                   toView:subview]
                             withEvent:event];

        if (hitTestView && ![hitTestView isKindOfClass:[ContainerView class]])
        {
            break;
        }
    }

    return hitTestView;
}

在底线上的问题是,一个视图如何仅处理某些手势并传递其他手势,以便底层视图可以处理它们。
我已经阅读了很多关于这个主题的内容,并尝试了不同的方法,但找不到一个直接的解决方案来解决看似非常普遍的问题。

1 个答案:

答案 0 :(得分:2)

您实际上不需要手动处理UIScrollView上的pinch和pan手势,它会自动发生。

要处理容器视图子视图,您可以使用UITapGestureRecognizer。对于每个视图,您需要处理点击使用:

UITapGestureRecognizer* tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapFirstSubview:)];
[firstSubview addGestureRecognizer:tapRecognizer];

处理程序方法:

- (void)handleTapFirstSubview:(UITapGestureRecognizer *)tapRecogmizer
{
    // handle tap here
}