UIGestureRecognizer阻塞表视图滚动

时间:2010-07-20 23:35:32

标签: cocoa-touch uiview ipad uigesturerecognizer

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

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

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

这里的问题是InfoView对象上的触摸被截获,因此它们不会被转发到包含UITableView的{​​{1}},这是父视图InfoCell。这意味着我无法再拖动InfoView视图来滚动表格视图,这是一个问题,因为InfoView涵盖整个InfoView

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

InfoCell

[super touchesBegan:touches withEvent:event];[touchView.superview.superview touchesBegan:touches withEvent:event];获取对其父touchView.superview.superview的引用)

但到目前为止还没有任何工作。此外,我UITableView的{​​{1}}属性设置为cancelsTouchesInView,因此不会干扰触摸。

帮助表示赞赏。谢谢!

4 个答案:

答案 0 :(得分:25)

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

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

答案 1 :(得分:9)

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

答案 2 :(得分:3)

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

答案 3 :(得分:3)

您可以尝试添加此通知

- (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;
}