拦截 UITableView 滚动触摸

Posted

技术标签:

【中文标题】拦截 UITableView 滚动触摸【英文标题】:Intercept UITableView scroll touches 【发布时间】:2010-06-03 20:53:22 【问题描述】:

是否可以在我自己的代码中控制 UITableView 何时滚动。

我试图获得垂直滑动滚动和水平滑动传递到我的代码的行为(其中有很多示例)

但是

我希望对角滑动什么都不做,即 UITableView 甚至不应该开始滚动。

我试着在这里捕捉它

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView

scrollView.contentOffset.x 始终为 0,因此我无法检测到水平移动。

我也尝试子类化 UITableView 并实现

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event

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

等等。

但是 UITableView(我猜它是父 UIScrollView)在通知触摸之前开始滚动?

要重新迭代,如果进行对角滑动,我希望 UITableView 滚动被锁定,但垂直滚动正常。

(此行为可以在 iPhone 的 Tweetie(Twitter) 中看到)

感谢您的帮助!

【问题讨论】:

【参考方案1】:

如果您可以使用 3.2 或更高版本,则 UIGestureRecognizer 套件应该允许这样做。有一系列调用允许某些手势取消或与其他手势互操作,您应该能够创建一个自定义的对角滑动手势来取消其他手势但实际上它本身并不做任何事情。

在 3.2 之前,UIScrollView 手势处理基本上没有记录。您可以通过标准的 touchesBegan UIResponder 调用来检测轻敲但不能检测移动。我认为一旦它检测到运动,它就会占用运行循环并捕获所有事件,绕过正常的事件链。

请注意,总是调用 setContentOffset。您可以创建 UIScrollView 的子类,并且当您在事件跟踪期间检测到对角线偏移时,不要将其传递给 super。我不知道这是否会奏效或效果如何,但它是开始的地方。

【讨论】:

谢谢,UIGestureRecognizer 对滑动检测的处理比我用任何其他方法实现的要好得多。我的目标是 iPad,所以效果很好:-) 顺便说一下,你需要做recognizer.cancelsTouchesInView = YES;在你的处理程序中实现我想要的效果。

以上是关于拦截 UITableView 滚动触摸的主要内容,如果未能解决你的问题,请参考以下文章

iOS 识别触摸但不拦截

UITableView 在滚动时不响应某些触摸

防止 UITableView 在自定义子视图处理触摸时滚动

如何根据 UITableView 滚动动态调整 UITableViewCell 的大小?

UITableView滚动式cell错位

UITableView, setContentOffset 动画:NO 不会在 iPad 上滚动