iOS在收起键盘(scrollview)及其失败的解决方法

正常的方法,这里只列举一种


- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
      [self.view endEditing:YES];
}

但是无论如何点击都不走这个方法,看了好久原来是UIScrollView 搞的鬼,所以要使用下边的添加手势方法了.有些人说要继承UIScrollView重写某方法,太麻烦.还是下边的简单实用

-(UIScrollView *)scrollV{
    if (!_scrollV) {
        _scrollV = [[UIScrollView alloc] init];
     
        UITapGestureRecognizer *tapGeature = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKetBoadr)];
        tapGeature.cancelsTouchesInView = NO;//设置成NO表示当前控件响应后会传播到其他控件上,默认为YES。
        [_scrollV addGestureRecognizer:tapGeature];
    }
    return _scrollV;
}
- (void)hideKetBoadr
{
    [self.view endEditing:YES];
}

查阅资料复制相关知识点如下
cancelsTouchesInView
这句话的意思就是说设置这个值将会影响到手指的触摸事件是否会传送到添加该手势的View上在本文中即recongizer.view(tableView)这样可能还是不够清晰,

再说清楚一些就是当我们添加一个reconnizer手势给一个视图的时候,当前window分发触摸事件的时候,会先问该手势有没有被识别(可以理解为于手势绑定的action方法有没有被触发),

当手势识别成功,就会问cancelsTouchesInView是否为YES,

如果设置为YES,触摸事件就不会继续分发,那么tableview的 tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath方法不会触发,因为触摸事件被提前结束了!

当手势识别失败的时候(即没有被调用的时候), window就会继续把事件传递下去给该tableView,因为View也是继承自UIResponder的,会立即执行 touchesCancelled:withEvent: or pressesCancelled:withEvent: 到此一个触摸事件循环结束!

那么当cancelsTouchesInView设置为NO会发生什么样的变化呢?

前面还是不变,当手势识别成功,就会问cancelsTouchesInView是否为YES,如果设置为NO,触摸事件会继续传递给响应链,就不会立即返回,因此还是会调用tableView的tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 还有cell 的按钮触发方法,都是不会受到影响的!

换句话说就是cancelsTouchesInView :如果Recognizer分析成功,就会解除View上的绑定的剩余手势事件,那么windows也不会给发送这写手势事件。windows通过给view发送touchesCancelled:withEvent:消息来退出旧事件处理。

在Touch事件中,Window对象会将事件分给Touch事件所触发的视图(hit-test视图),
cancelsTouchesInView默认为YES,当GestureRecognizer识别到相应的手势后,会向hit-test视图发送,并且发送成功相应后,就会解除在View上的绑定的剩余所有的手势事件.

cancelsTouchesInView为NO后,当前的控件在响应后还会继续传到其他控件上

你可能感兴趣的:(iOS在收起键盘(scrollview)及其失败的解决方法)