iOS開發中讓子視圖不響應父視圖的手勢識別器

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

參考鏈接:

子視圖不響應父視圖的手勢識別器

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容