Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 滑动手势识别器在垂直方向不工作_Iphone_Ios_Objective C_Cocoa Touch_Uiswipegesturerecognizer - Fatal编程技术网

Iphone 滑动手势识别器在垂直方向不工作

Iphone 滑动手势识别器在垂直方向不工作,iphone,ios,objective-c,cocoa-touch,uiswipegesturerecognizer,Iphone,Ios,Objective C,Cocoa Touch,Uiswipegesturerecognizer,伙计们,我对Objective C和XCode完全不熟悉,所以在这个问题上不要对我太苛刻。事实上,这是我关于StackOverflow的第一个问题。问题如下: 我需要的功能关闭键盘时,点击或滚动文本字段以外的任何地方,目前是第一反应 我通过下面的代码右击示例成功地实现了轻击和水平击: UISwipeGestureRecognizer *swipeGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self ac

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

我需要的功能关闭键盘时,点击或滚动文本字段以外的任何地方,目前是第一反应

我通过下面的代码右击示例成功地实现了轻击和水平击:

UISwipeGestureRecognizer *swipeGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(closeKeyboard:)];
swipeGestureRecognizer.direction = UISwipeGestureRecognizerDirectionRight;
[self.tableView addGestureRecognizer:swipeGestureRecognizer];
swipeGestureRecognizer.cancelsTouchesInView = NO;        
事实上,后来我知道了如何只用界面生成器来实现它。但是垂直滑动无法工作,无论是通过编程还是通过IB。我怀疑问题在于我的tableView在屏幕上垂直滚动,从而阻止了滑动的调用,但我仍然不知道如何克服这个问题


我将非常感谢你的帮助!谢谢。

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

UITableView基本上使用UIScrollView&当您实现UITableView委托时,您还实现了UIScrollView委托,因为在幕后,UITableViewDelegate实现了UIScrollViewDelegate 您不必手动实现UIScrollViewDelegate&只需开始使用所需的任何UIScrollView代理,例如-voidscrollViewDidScroll:

但是,如果您希望在tableview上使用垂直滑动,那么可以使用以下肮脏且完全有缺陷的技术来完成。基本上这就是不做的方法

主属性是将tableView对象上的DelaysContentTouches设置为NO。 在UISweepGestureRecognizer对象上设置方向以检测垂直向上和垂直向下滑动。 在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毫秒内没有明显移动,它会将事件传递到内部视图

如果在150ms内显著移动手指,它将开始滚动,并且不会将事件传递到内部视图。注: 当您触摸一个属于滚动视图和 立即开始滚动,您触摸到的行永远不会显示 突出显示

如果在150ms内没有明显移动手指,UIScrollView开始将事件传递到内部视图,但是 您已将手指移动到足以开始滚动的位置, UIScrollView在内部视图上调用touchesCancelled并启动 滚动。注意:当你触摸桌子时,如何握住手指 位,然后开始滚动,您触摸的行将高亮显示 首先,但随后取消突出显示

这些事件序列可以通过配置 UIScrollView:

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

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

请注意,接收所有touchBegin的是UIScrollView, 触摸CoCoCoatTouch移动、触摸Sended和触摸取消的事件 因为它的命中测试告诉它这样做。然后将它们转发给 内部视图,如果它愿意,只要它愿意

资料来源:


感谢您的回复,它在大多数情况下都能正常工作,但是如果我即将进入文本字段,它需要自动向上滚动,就像文本字段位于tableView的底部一样,它会触发scrollViewDidScroll方法,并且键盘会立即隐藏,这是不好的。因此,我需要一种方法来区分滚动是由用户触发的还是自动触发的。