由于本项目里面基类封装的是键盘弹起 点击屏幕任何一处响应tap事件让编辑完成 键盘消失
- (void) backgroundTapDismissKeyboard:(UIGestureRecognizer *) gestureRecognizer{
//将self.view里所有的subview的first responder 都resign掉
[self.view endEditing:YES];
}
最近产品要求键盘弹起的时候 加个历史记录 ,历史记录还可以无限滚动 ,删除等
想着用UICollectionView ,方便各种操作,后来点击传值到输入框的时候出现个诡异事件,collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath 方法没有响应,经过查到 ,事件确实被阻挡了,后来的解决方案是
解决方案1.
通过tap属性获取点击位置 判断point是否在_collectionCell
上 在就执行didSelectItem方法(手动调用)
- (void)collectionViewClickAction:(UITapGestureRecognizer *)tap{
CGPoint point = [tap locationInView:_collectionViewDeatil];
//根据点获取点击的是哪一个 这个经典
NSIndexPath *index = [_collectionViewDeatil indexPathForItemAtPoint:point];
if (index != nil) {
_isInputBussinessName=NO;
[self collectionView:_collectionViewDeatil didSelectItemAtIndexPath:index];
}
// [self.view endEditing:YES];
}
解决方案2.
通过代理方法判断_collection
是不是第一响应者(事件传递由上至下) 如果不是就拦截tap
手势
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
if (touch.view != _collection) {
[_titleT resignFirstResponder];
[contentTV resignFirstResponder];
return NO;
}
return YES;
}
原理是把阻挡的事件取消响应,使得代理方法执行。
前提是给视图加入tap事件(第一种 // UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(collectionViewClickAction:)];
第二种 UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]init];)
// // 为collectionView添加手势,点击回收键盘
// UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(collectionViewClickAction:)];
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]init];
// 利用代理方法解决后边手势与item点击事件之间的冲突
tap.delegate = self;
[_collectionViewDeatil addGestureRecognizer:tap];