1、项目需求:
给父视图上添加一个子视图,给父视图添加一个手势识别器UITapGestureRecognizer,点击子视图时,实现不触发UITapGestureRecognizer所关联的事件。
比如:父视图是一个自定义的UIView A ,子视图是一个UITextView B。
此时给父视图 A 绑定一个长按操作。但是,子视图 B本身就会有长按选中的手势。
如果,在子视图B中长按,也会触发父视图 A的自定义长按事件。这样就造成 B的长按选中失效。
所以,目标是让父视图A的长按事件不干扰子视图B的长按事件。
2、思路分析
设置手势代理 + 实现方法
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
3、示例代码(思路)
1、遵守手势代理协议
<UIGestureRecognizerDelegate>
2、
YYTextView *edittingArea = [[YYTextView alloc] initWithFrame:CGRectMake(8, 0, kScreenSize.width - 16, edittingAreaHeight)];
_edittingArea = edittingArea;
_edittingArea.placeholderText = @"请输入评论?";
_edittingArea.placeholderFont = [UIFont systemFontOfSize:16];
[_collectionView addSubView:_edittingArea];
//父视图长按手势
UILongPressGestureRecognizer *longPressGR = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(moveClick:)];
//设置当前控制器,是手势事件的代理
longPressGR.delegate = self;
[_collectionView addGestureRecognizer:longPressGR];
3、代理方法实现:
// 父视图UICollectionView 的长按事件。编辑框不可接受。以此保证,可以正常的长按选中文本。
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
//如果是子视图 self.edittingArea ,设置无法接受 父视图_collectionView 的长按事件。
if ([touch.view isDescendantOfView:self.edittingArea]) {
return NO;
}
return YES;
}