新建一個 父view:A ,并且在這個 父view(A) 上添加點擊事件:tap;然后在 父view 上再添加子 view:(B).這時候點擊B的時候也會響應A 的點擊事件
- 如果 子 view B 默認是關閉用戶交互狀態
當 B 是類似于 UIImageView 這種默認關閉用戶交互的控件,這時候點擊 B 是不會有反應的.如果為 B 添加另一個點擊手勢:tap2.
// preView
UIView *preView = [UIView new];
UITapGestureRecognizer *tap1 = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapView)];
[preView addGestureRecognizer:tap1];
UIImageView *imgView = [UIImageView new ];
[preView addsubview:imgView];
// 開啟 imgView 的手勢交互
imgView.userInteractionEnabled = YES;
// 然后imgView 添加點擊手勢 tap2,這時候 tap1 和 tap2是不會產生干擾的
- 但是,更普遍的情況是:當子 view B 也會自動響應父 view 的響應事件
- 可以通過設置點擊手勢的代理方法,確定父view上的點擊手勢什么時候響應
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapView)];
tap.delegate = self;
[self addGestureRecognizer:tap];
// tap 的代理方法
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
if ([touch.view isDescendantOfView:self.tbView]) {
return NO;
}
if ([touch.view isKindOfClass:[UITextField class]]){
return NO;
}
// 若為UITableViewCellContentView(即點擊了tableViewCell),則不截獲Touch事件
// NSLog(NSStringFromClass([touch.view class]));
if ([NSStringFromClass([touch.view class]) isEqualToString:@"UITableViewCellContentView"]) {
return NO;
}
return YES;
}
- 對于布局簡單的父控件與子控件,可以設置父控件的點擊手勢的響應區域