滑动手势识别器无法在垂直方向上工作

时间:2013-10-16 21:05:52

标签: iphone ios objective-c cocoa-touch uiswipegesturerecognizer

伙计们,我对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在屏幕上垂直滚动,从而阻止了滑动的调用,但我仍然不知道如何克服这个问题。

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

但是如果您希望垂直滑动在tableview上工作,那么可以在以下&完全越野车技术。 (基本上这就是 NOT 这样做的方式)

    tableView对象的
  1. MAIN 属性 setDelaysContentTouches
  2. UISwipeGestureRecognizer 对象上的
  3. setDirection ,以检测垂直向上& 垂直向下滑动。
  4. 将滑动手势设置到 tableView 对象上。
  5. 示例:

    [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毫秒内显着移动手指,它将开始滚动(并且永远不会将事件传递到内部视图)。注意:   当你触摸一个表(它是滚动视图的子类)和   立即开始滚动,你触摸的行永远不会   突出显示。

    •   
    • 如果你没有在150ms内显着移动手指并且UIScrollView开始将事件传递到内部视图,但随后   你已经将手指移动到足以让滚动开始,   UIScrollView在内部视图上调用touchesCancelled并启动   滚动。注意:当您触摸桌子时,请握住手指   然后开始滚动,突出显示您触摸的行   首先,但之后不再突出显示。

    •   
         

    这些事件序列可以通过配置来改变   的UIScrollView:

         
        
    • 如果delaysContentTouches为NO,则不使用计时器 - 事件立即转到内部控件(但如果移动则会取消   你的手指足够远)

    •   
    • 如果cancelsTouches为NO,则一旦将事件发送到控件,滚动将永远不会发生。

    •   
         

    请注意,UIScrollView接收所有touchesBegin,   touchesMoved,touchesEnded和touches来自CocoaTouch的Canceled事件   (因为它的hitTest告诉它这样做)。然后它将它们转发给   内部视图,如果它想,只要它想。

         

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