1

伙计们,我对 Objective C 和 XCode 完全陌生,所以对于这样的问题不要对我太苛刻。事实上,这是我在 StackOverflow 上的第一个问题。问题如下:

我需要在当前作为第一响应者的 textField 之外的任何地方点击或滚动时关闭键盘的功能。

我设法使用以下代码(右滑动示例)为点击和水平滑动实现它:

UISwipeGestureRecognizer *swipeGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(closeKeyboard:)];
swipeGestureRecognizer.direction = UISwipeGestureRecognizerDirectionRight;
[self.tableView addGestureRecognizer:swipeGestureRecognizer];
swipeGestureRecognizer.cancelsTouchesInView = NO;        

事实上,后来我想出了如何使用单独的界面构建器来做到这一点。但是垂直滑动不起作用,无论是当我以编程方式进行时,还是通过 IB 时。我怀疑问题是我的 tableView 在屏幕上垂直滚动,从而阻止了滑动的调用,但我仍然不知道如何克服这个问题。

非常感谢您的帮助!谢谢。

4

2 回答 2

0

UITableView 基本上使用 UIScrollView 并且当您实现 UITableView 委托时,您还实现了 UIScrollView 委托(因为在幕后,UITableViewDelegate 已经实现了 UIScrollViewDelegate)
您不必手动实现 UIScrollViewDelegate 并且您可以简单地开始使用任何 UIScrollView 委托你想要的-(void)scrollViewDidScroll:

但是,如果您希望在 tableview 上进行垂直滑动,那么可以通过以下肮脏且完全错误的技术来完成。(基本上这是这样做的方法)

  1. MAIN属性将 tableView 对象上的setDelaysContentTouches设置为NO
  2. 设置UISwipeGestureRecognizer对象上的setDirection以检测垂直向上垂直向下滑动。
  3. 将滑动手势设置到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,那么一旦将事件发送到控件,滚动将永远不会发生。

请注意,它是 UIScrollView 接收来自 CocoaTouch 的所有 touchesBegin、touchesMoved、touchesEnded 和 touchesCanceled 事件(因为它的 hitTest 告诉它这样做)。然后,只要它愿意,它就会将它们转发到内部视图。

来源:https ://stackoverflow.com/a/844627/2857130

于 2013-10-17T07:01:43.700 回答
0

我看到,您正在尝试将此垂直手势添加到 tableView。所以你不需要添加垂直滑动手势。您必须实现UIScrollViewDelegate协议,并实现 - scrollViewDidScroll: 或 - scrollViewWillBeginDragging: 方法。在这些方法中,您可以捕捉到您的 tableview 是否滚动,如果您的 tableView 正在滚动,请调用您的 closeKeyboard 方法

于 2013-10-16T21:08:40.200 回答