【问题标题】:How to allow sibling UIViews to handle different gestures?如何允许兄弟 UIViews 处理不同的手势?
【发布时间】:2014-04-11 02:36:59
【问题描述】:

我有一个 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;
}

归根结底,这里的问题是一个视图如何只处理一些手势并传递其他手势,以便底层视图可以处理它们。
我已经阅读了很多关于该主题的内容并尝试了不同的方法,但找不到一个简单的解决方案来解决这个看似很常见的问题。

【问题讨论】:

    标签: ios uigesturerecognizer siblings


    【解决方案1】:

    您实际上不需要手动处理 UIScrollView 上的捏合和平移手势,它会自动发生。

    要处理容器视图子视图,您可以使用 UITapGestureRecognizer。对于您需要处理水龙头使用的每个视图:

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

    处理方法:

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

    【讨论】:

    • 我对每个子视图都有一个点击手势识别器,并且持有主视图的视图控制器正在处理它们。问题不是我想自己处理 UIScrollView 的捏和平移,而是容器视图阻止 UIScrollView 获取这些手势。有没有办法将这些手势传递给底层的 UIScrollView?
    猜你喜欢
    • 2018-07-24
    • 2020-12-16
    • 2016-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-15
    • 1970-01-01
    • 2013-06-17
    相关资源
    最近更新 更多