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;
}