ジェスチャー競合の問題を解決する方法
2398 ワード
開発中に次のような問題に遭遇した.クリックイベントが多いため、ジェスチャーを加えるクリックイベントを追加する必要がある.ジェスチャーの衝突の問題が発生しました特にtapクリックイベントとtableViewのクリックイベントである.最初はジェスチャーとViewの追加順序に影響があると思っていましたが、その後、テストされたのはこの方面の問題ではありません.次はテストされたデータ、tableView、tapジェスチャー、buttonです.
クリック方法では、1>viewをクリックするとclickメソッドが実行される場合があります.2>tableViewをクリックするとclickメソッドのみが実行されます*-(void)tableView:(UItableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath*は実行されません.3>btnをクリックすると、clickBtnメソッドが実行されます.明らかにtableViewはジェスチャーと衝突しているが、btnはいない.
ソリューションコントローラは、以下の方法でプロトコルを遵守します.
- (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;
}