ジェスチャー競合の問題を解決する方法

2398 ワード

開発中に次のような問題に遭遇した.クリックイベントが多いため、ジェスチャーを加えるクリックイベントを追加する必要がある.ジェスチャーの衝突の問題が発生しました特にtapクリックイベントとtableViewのクリックイベントである.最初はジェスチャーとViewの追加順序に影響があると思っていましたが、その後、テストされたのはこの方面の問題ではありません.次はテストされたデータ、tableView、tapジェスチャー、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; //  
    [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");
}

クリック方法では、1>viewをクリックするとclickメソッドが実行される場合があります.2>tableViewをクリックするとclickメソッドのみが実行されます*-(void)tableView:(UItableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath*は実行されません.3>btnをクリックすると、clickBtnメソッドが実行されます.明らかにtableViewはジェスチャーと衝突しているが、btnはいない.
ソリューションコントローラは、以下の方法でプロトコルを遵守します.
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    //  tableViewCell Touch 
    if ([NSStringFromClass([touch.view class]) isEqualToString:@"UITableViewCellContentView"]) {
        return NO;
    }
    return  YES;
}