私はボードゲームアプリ(チェスなど)を書いています。メイン ビューは、ボードを回転させるフルスクリーン ビューの任意の場所で開始されたスワイプ ジェスチャ (UISwipeGestureRecognizer) を認識します。
ここで、ボードの真上に正方形の透明なサブビューを追加しました。これはタッチを検出する UIControl サブクラスです - ボード上でのポーンの動きとして:
[self.view addSubview:self.boardControl]
UIControl サブクラスで覆われている画面の領域でスワイプ ジェスチャがブロックされることを期待していました。そして、そうではありません。そのため、正方形の boardControl をすばやくタッチ アンド ドラッグ (スワイプ) すると、最初はポーンの動きとして検出されますが、ボードを回転させるスワイプとして再び検出されます。
UIControl サブクラスを作成して、そのフレームで開始されたタッチ イベントのスーパービューへのフローをブロックするにはどうすればよいですか?
次のいずれかの方法で、スーパービューのレベルでタッチをフィルタリングすることで、アプリがスワイプ ジェスチャに反応しないようにすることができます。
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
CGPoint location = [gestureRecognizer locationInView:self.view];
CGRect frame = self.boardControl.frame;
if ( CGRectContainsPoint(frame, location) )
return NO;
return YES;
}
または:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldReceiveTouch:(UITouch *)touch
{
CGPoint location = [touch locationInView:self.view];
CGRect frame = self.boardControl.frame;
if (CGRectContainsPoint(frame, location))
return NO;
return YES;
}
しかし、私はその問題を 1 レベル前に解決したいと考えています。boardControl が、ビュー階層の上位にあるフレーム タッチ イベント内で開始されたものを渡さないようにしたいと考えています。
UIControl サブクラスでそのスーパービューを「カバー」し、取得したすべてのタッチを「食べる」ことができるので、そのようなタッチを除外する必要があるかどうかを推測するためにスーパービューがそのフレームにアクセスする必要はありませんか?