在開發(fā)中碰到了下面的問題.由于點(diǎn)擊事件比較多,需要添加手勢進(jìn)行添加點(diǎn)擊事件.然后出現(xiàn)了手勢沖突的問題.尤其是 tap 點(diǎn)擊事件與 tableView的點(diǎn)擊事件. 開始以為是手勢和 View 的添加順序有影響,后來經(jīng)測試不是這方面的問題
下面是測試的數(shù)據(jù), 一個(gè)tableView, 一個(gè) tap 手勢,一個(gè) button:
- (void)viewDidLoad {
[super viewDidLoad];
UITableView *tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 200, 100)];
[self.view addSubview:tableView];
tableView.delegate = self;
tableView.dataSource = self;
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] init];
tap.delegate = self; // 解決問題時(shí)設(shè)置代理
[self.view addGestureRecognizer:tap];
[tap addTarget:self action:@selector(click)];
UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(100, 200, 50, 50)];
btn.backgroundColor =[UIColor redColor];
[self.view addSubview:btn];
[btn addTarget:self action:@selector(clickBtn) forControlEvents:UIControlEventTouchUpInside];
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return 20;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
}
cell.textLabel.text = @"aaaa";
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSLog(@"-----");
}
- (void)click {
NSLog(@"=====");
}
- (void)clickBtn {
NSLog(@"aaaa");
}
通過點(diǎn)擊方法,有下面的情況:
1> 點(diǎn)擊 view 會執(zhí)行 click 方法;
2> 點(diǎn)擊 tableView 只會執(zhí)行 click 方法 *- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath *不會被執(zhí)行;
3> 點(diǎn)擊 btn, 會執(zhí)行 clickBtn 方法;
很明顯, tableView 和手勢有沖突, btn 卻沒有.
解決方案 控制器遵守協(xié)議 UIGestureRecognizerDelegate,實(shí)現(xiàn)下面的方法
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
// 點(diǎn)擊tableViewCell不執(zhí)行Touch事件
if ([NSStringFromClass([touch.view class]) isEqualToString:@"UITableViewCellContentView"]) {
return NO;
}
return YES;
}