【问题标题】:UIGestureRecognizer blocking table view scrollingUIGestureRecognizer 阻止表格视图滚动
【发布时间】:2010-07-20 23:35:31
【问题描述】:

我正在使用自定义 UIGestureRecognizer 子类来跟踪我的 InfoView 类上的手势。 InfoView 类是称为InfoCell 的自定义UITableViewCell 子类的子视图。

我已将手势识别器添加到我的根视图(屏幕上其他所有内容的父视图,因为我的自定义手势识别器的目的是允许在表格之间拖动 InfoCell 视图)。现在,除了一件事,一切都按原样进行。我在UIGestureRecognizer 子类中使用以下代码来检测InfoView 视图上的触摸:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UIView *touchView = [[touches anyObject] view];
    if ([touchView isKindOfClass:[InfoView class]]) {
        // Do stuff
    }

这里的问题是InfoView 对象上的触摸被拦截,因此它们没有被转发到包含InfoCell 的UITableView,这是InfoView 的父视图。这意味着我不能再通过拖动InfoView 视图来滚动表格视图,这是一个问题,因为InfoView 覆盖了整个InfoCell。

有什么方法可以将触摸转发到表格视图上以便它可以滚动?我已经尝试了很多东西:

[super touchesBegan:touches withEvent:event];

[touchView.superview.superview touchesBegan:touches withEvent:event];(touchView.superview.superview 获得对其父级 UITableView 的引用)

但到目前为止没有任何效果。另外,我的UIGestureRecognizer 的cancelsTouchesInView 属性设置为NO,因此不会干扰触摸。

感谢您的帮助。谢谢!

【问题讨论】:

    标签: cocoa-touch uiview ipad uigesturerecognizer


    【解决方案1】:

    查看 UIGestureRecognizerDelegate 方法:- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer

    如果返回 YES,它将阻止您的手势识别器踩到 UIScrollView 用于检测滚动的手势识别器。

    【讨论】:

    • 在这个问题上我一直在敲我的头。谢谢 ! :D
    【解决方案2】:

    UIGestureRecognizer 有一个属性“cancelsTouchesInView”,默认设置为 YES。这意味着当手势被识别时,UIView 中的触摸被取消。尝试将其设置为 NO 以允许 UIScrollView 接收更多触摸事件。

    【讨论】:

      【解决方案3】:

      我的touchesBegan 方法中有一行将手势识别器的state 属性设置为UIGestureRecognizerStateBegan。删除此行似乎可以解决问题。

      【讨论】:

        【解决方案4】:

        您可以尝试添加此通知

        - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
            if ([gestureRecognizer class] == [UIPanGestureRecognizer class]) {
                UIPanGestureRecognizer *panGestureRec = (UIPanGestureRecognizer *)gestureRecognizer;
                CGPoint point = [panGestureRec velocityInView:self];
                if (fabsf(point.x) > fabsf(point.y) ) {
                    return YES;
                }
            }
            return NO;
        }
        

        【讨论】:

        • 这是正确答案,如果手势是垂直的,请阻止 panGesture 启动。
        猜你喜欢
        • 2012-09-30
        • 2012-09-07
        • 1970-01-01
        • 1970-01-01
        • 2018-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多