在UIScrollView内检测UITableViewCell上的滑动手势

10

我希望有人能够帮助我解决一个让我头痛的问题!

给定以下视图层次结构:

enter image description here

我想能够检测自定义UITableViewCell上的滑动手势。

我已经子类化了UIScrollView,并有一个hitTest:withEvent:方法来检查我是否正在触摸tableview单元格(或其内容),如果是,则设置以下滚动视图属性:

- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    UIView* result = [super hitTest:point withEvent:event];
    if ([result.superview isKindOfClass:[UITableViewCell class]] || [result.superview tag] == SUBVIEW_TAG)
    {
        self.canCancelContentTouches = NO;  
        self.delaysContentTouches = YES;
    } else {
        self.canCancelContentTouches = YES;
        self.delaysContentTouches = NO;
    }
    return result;
}

我也实现了:

- (BOOL)touchesShouldCancelInContentView:(UIView *)view
{
    if (view.tag == SUBVIEW_TAG || [[view superview] isKindOfClass:[UITableViewCell class]])
        return NO;
    return YES;
}

如果被触摸的视图是表格视图单元格,我将返回NO。

这些方法都按预期调用并执行其操作,但我仍然无法阻止UIScrollView "独占"滑动手势。

有趣的是,如果我在上面两个方法中都包含包含表格视图和单元格的UIView(使用SUBVIEW_TAG的那个方法),它就可以正常运行,所以我猜测这一定与UITableView继承自UIScrollView有关。

我的主要目标是能够在单元格上滑动以显示更多单元格选项。 在该视图的任何其他位置水平滑动都将被滚动视图捕获,并根据其正常行为在水平方向上移动内容。

任何想法将非常感谢!

谢谢!Rog


将手势识别器添加到UITableViewCell中不足以吗? - teriiehina
你解决过这个问题吗?如果是的话,能否分享一下你的解决方案?你非常清晰地描述了问题,并且详细地阐述了它 - 如果能以类似的方式回答,那就太棒了! - iOSProgrammingIsFun
是的,解决这个问题的方案将会非常棒。 - Pasta
2个回答

3

我曾经在ScrollView内部的一个组件上遇到了类似的滑动检测问题,我通过以下方法解决了它:

[scrollView.panGestureRecognizer requireGestureRecognizerToFail:swipeGesture]

scrollView是类似容器的滚动视图对象,而swipeGesture是滚动视图内部的手势识别组件。

因此,您可以像这样为单元格对象定义滑动操作(在此示例中为向右滑动,按照您的需要进行自定义)

UISwipeGestureRecognizer* rightSwipeRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(yourMethod)];
        [rightSwipeRecognizer setDirection:UISwipeGestureRecognizerDirectionLeft];

[cell addGestureRecognizer:rightSwipeRecognizer];

然后执行

[scrollView.panGestureRecognizer requireGestureRecognizerToFail:rightSwipeRecognizer]
requireGestureRecognizerToFail 的文档说明如下:
此方法创建了与另一个手势识别器之间的关系,延迟接收者从UIGestureRecognizerStatePossible状态转换。接收者转换到的状态取决于otherGestureRecognizer发生的情况:
如果otherGestureRecognizer转换为UIGestureRecognizerStateFailed,则接收者转换为其正常的下一个状态。
如果otherGestureRecognizer转换为UIGestureRecognizerStateRecognized或UIGestureRecognizerStateBegan,则接收者转换为UIGestureRecognizerStateFailed。
可能调用此方法的示例是当您想要单击手势需要双击手势失败时。
可在iOS 3.2及更高版本中使用。

2
解决方案非常简单。您只需要在UITableViewCell内部添加UIScrollView即可。它将防止在滑动手势期间出现“卡顿”效果。

Embedded UIScrollView


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接