UITableView 基本上使用 UIScrollView 并且当您实现 UITableView 委托时,您还实现了 UIScrollView 委托(因为在幕后,UITableViewDelegate 已经实现了 UIScrollViewDelegate)
您不必手动实现 UIScrollViewDelegate 并且您可以简单地开始使用任何 UIScrollView 委托你想要的-(void)scrollViewDidScroll:
但是,如果您希望在 tableview 上进行垂直滑动,那么可以通过以下肮脏且完全错误的技术来完成。(基本上这是不这样做的方法)
- MAIN属性将 tableView 对象上的setDelaysContentTouches设置为NO。
- 设置UISwipeGestureRecognizer对象上的setDirection以检测垂直向上和垂直向下滑动。
- 将滑动手势设置到tableView对象上。
例子:
[self.tableView setDelaysContentTouches:NO];
UISwipeGestureRecognizer *mySwipe = [[UISwipeGestureRecognizer alloc]
initWithTarget:self
action:@selector(closeKeyboard:)];
[mySwipe setDirection: UISwipeGestureRecognizerDirectionUp | UISwipeGestureRecognizerDirectionDown];
[self.tableView addGestureRecognizer:mySwipe];
最后,你会得到它的工作,但它真的很糟糕。
- 大多数情况下,滑动会被忽略,因为您需要非常快速地滑动并在滑动动作中覆盖适当的距离。
- 当滑动工作时,表格不会滚动。
所以,正如你所看到的,这真的是一件可悲和肮脏的事情。
原因是 scrollView 以非常特定的方式处理内容触摸。
为了决定触摸是被处理还是被转发,当你第一次触摸它时, UIScrollView 会启动一个计时器:
如果您在 150 毫秒内没有显着移动手指,它会将事件传递到内部视图。
如果您在 150 毫秒内显着移动了手指,它就会开始滚动(并且永远不会将事件传递到内部视图)。注意:当您触摸表格(这是滚动视图的子类)并立即开始滚动时,您所触摸的行永远不会突出显示。
如果您在 150 毫秒内没有显着移动手指并且 UIScrollView 开始将事件传递给内部视图,但是您已经将手指移动得足够远以开始滚动,则 UIScrollView 在内部视图上调用 touchesCancelled 并开始滚动。注意:当您触摸表格时,如何按住手指然后开始滚动,您触摸的行首先突出显示,然后取消突出显示。
这些事件的顺序可以通过 UIScrollView 的配置来改变:
请注意,它是 UIScrollView 接收来自 CocoaTouch 的所有 touchesBegin、touchesMoved、touchesEnded 和 touchesCanceled 事件(因为它的 hitTest 告诉它这样做)。然后,只要它愿意,它就会将它们转发到内部视图。
来源:https ://stackoverflow.com/a/844627/2857130