たとえば、2つの異なるジェスチャが必要なビューがあります。
タップしてアクションAを実行します。ダブルタップしてアクションBを実行します。
問題はUITapGestureRecognizerにあります。必要な最小タップ数しか設定できません。シングルタップジェスチャレコグナイザは、ダブルタップジェスチャレコグナイザがダブルタップを認識する前にタップを認識します。
例:
_tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGestureRecognized:)];
_tapGestureRecognizer.numberOfTouchesRequired = 1;
_tapGestureRecognizer.numberOfTapsRequired = 1;
[self addGestureRecognizer:_tapGestureRecognizer];
_doubleTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTapGestureRecognized:)];
_doubleTapGestureRecognizer.numberOfTouchesRequired = 1;
_doubleTapGestureRecognizer.numberOfTapsRequired = 2;
[self addGestureRecognizer:_doubleTapGestureRecognizer];
ダブルタップを非常に速く行っても、常にシングルタップを認識します。タップジェスチャレコグナイザーが待機し、ダブルタップジェスチャレコグナイザーが認識するかどうかを確認するように設定するにはどうすればよいですか?
これが私の古いプロジェクトの1つで使用したものです。それがあなたの助けになることを願っています。
UITapGestureRecognizer *singleTap = [[[UITapGestureRecognizer alloc] initWithTarget: self action:@selector(doSingleTap)] autorelease];
singleTap.numberOfTapsRequired = 1;
[self.view addGestureRecognizer:singleTap];
UITapGestureRecognizer *doubleTap = [[[UITapGestureRecognizer alloc] initWithTarget: self action:@selector(doDoubleTap)] autorelease];
doubleTap.numberOfTapsRequired = 2;
[self.view addGestureRecognizer:doubleTap];
[singleTap requireGestureRecognizerToFail:doubleTap];
オンSwift 3およびSwift 4:
let singleTap = UITapGestureRecognizer(target: self, action: #selector(doSingleTap))
singleTap.numberOfTapsRequired = 1
self.view.addGestureRecognizer(singleTap)
let doubleTap = UITapGestureRecognizer(target: self, action: #selector(doDoubleTap))
doubleTap.numberOfTapsRequired = 2
self.view.addGestureRecognizer(doubleTap)
singleTap.require(toFail: doubleTap)
{ UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleDoubleTapGesture:)];
[doubleTap setDelegate:self];
doubleTap.numberOfTapsRequired = 2;
[self.headerView addGestureRecognizer:doubleTap];
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleSingleTapGesture:)];
singleTap.numberOfTapsRequired = 1;
[singleTap setDelegate:self];
[doubleTap setDelaysTouchesBegan:YES];
[singleTap setDelaysTouchesBegan:YES];
[self.headerView addGestureRecognizer:singleTap];
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
return YES;
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
return YES;
}
必要なメソッド内にジェスチャレコグナイザーを作成します。たとえば、tableViewのheaderViewにタップジェスチャが必要な場合は、内部にそれらのタップジェスチャを作成します
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
また、クラスはUIGestureRecognizerDelegateを実装する必要があります。上記は、そのデリゲートクラスの2つのメソッドです。