伙计们,我对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在屏幕上垂直滚动,从而阻止了滑动的调用,但我仍然不知道如何克服这个问题。
非常感谢您的帮助!感谢。
答案 0 :(得分:0)
我看到,您正在尝试将此垂直手势添加到tableView。因此,您无需添加垂直滑动手势。您必须实施UIScrollViewDelegate
协议,并实施 - scrollViewDidScroll
:或 - scrollViewWillBeginDragging
:方法。在这些方法中,您可以捕获您的tableview滚动,如果您的tableView正在滚动,请调用您的closeKeyboard方法
答案 1 :(得分:0)
UITableView基本上使用UIScrollView&当您实现UITableView委托时,您还实现了UIScrollView委托(因为在幕后,UITableViewDelegate实现了UIScrollViewDelegate)
您不必手动实现UIScrollViewDelegate&你可以简单地开始使用你想要的任何UIScrollView委托,例如 - (void)scrollViewDidScroll:
但是如果您希望垂直滑动在tableview上工作,那么可以在以下脏&完全越野车技术。 (基本上这就是 NOT 这样做的方式)
示例:
[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告诉它这样做)。然后它将它们转发给 内部视图,如果它想,只要它想。