滑动手势识别器在垂直方向上不起作用
Posted
技术标签:
【中文标题】滑动手势识别器在垂直方向上不起作用【英文标题】:Swipe gesture recognizer not working in vertical directions 【发布时间】:2013-10-16 21:05:52 【问题描述】:伙计们,我对 Objective C 和 XCode 完全陌生,所以对于这样的问题不要对我太苛刻。事实上,这是我在 *** 上的第一个问题。问题如下:
我需要在当前作为第一响应者的文本字段之外的任何地方点击或滚动时关闭键盘的功能。
我设法用以下代码实现了它的点击和水平滑动(右滑动示例):
UISwipeGestureRecognizer *swipeGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(closeKeyboard:)];
swipeGestureRecognizer.direction = UISwipeGestureRecognizerDirectionRight;
[self.tableView addGestureRecognizer:swipeGestureRecognizer];
swipeGestureRecognizer.cancelsTouchesInView = NO;
事实上,后来我想出了如何仅使用界面生成器来做到这一点。但是垂直滑动不起作用,无论是当我以编程方式进行时,还是通过 IB 时。我怀疑问题是我的 tableView 在屏幕上垂直滚动,从而阻止了滑动的调用,但我仍然不知道如何克服这个问题。
非常感谢您的帮助!谢谢。
【问题讨论】:
【参考方案1】:我看到,您正在尝试将此垂直手势添加到 tableView。所以你不需要添加垂直滑动手势。您必须实现 UIScrollViewDelegate
协议,并实现 -scrollViewDidScroll
: 或 -scrollViewWillBeginDragging
: 方法。在这些方法中,您可以捕捉到您的 tableview 是否滚动,如果您的 tableView 正在滚动,请调用您的 closeKeyboard 方法
【讨论】:
感谢您的回复,它在大多数情况下确实有效,但是在我即将输入 textField 并且它需要自动向上滚动的情况下(例如当 textField 位于底部时) tableView),它触发了scrollViewDidScroll方法,键盘立即隐藏,不好。因此,我需要一种方法来区分滚动是由用户触发还是自动触发。【参考方案2】:UITableView 基本上使用 UIScrollView & 当你实现 UITableView 委托时,你也实现了 UIScrollView 委托(因为在幕后,UITableViewDelegate 已经实现了 UIScrollViewDelegate) 您不必手动实现 UIScrollViewDelegate 并且您可以简单地开始使用您想要的任何 UIScrollView 委托,例如 -(void)scrollViewDidScroll:
但是,如果您希望在 tableview 上进行垂直滑动,那么可以通过以下 dirty 和完全 buggy 技术来完成。 (基本上这就是不这样做的方式)
-
MAIN 属性是 setDelaysContentTouches 在您的 tableView 对象上为 NO。
setDirection 在您的 UISwipeGestureRecognizer 对象上检测垂直向上和垂直向下滑动。
在 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:
如果 delaysContentTouches 为 NO,则不使用计时器 — 事件会立即转到内部控件(但如果您移动,则会取消 你的手指够远了)
如果 cancelsTouches 为 NO,那么一旦将事件发送到控件,就永远不会发生滚动。
注意,接收所有touchesBegin的是UIScrollView, 来自 CocoaTouch 的 touchesMoved、touchesEnded 和 touchesCanceled 事件 (因为它的 hitTest 告诉它这样做)。然后将它们转发到 内心的看法,想怎样想就怎样。
来源:https://***.com/a/844627/2857130
【讨论】:
以上是关于滑动手势识别器在垂直方向上不起作用的主要内容,如果未能解决你的问题,请参考以下文章