1

非常に低い優先度にしたい単純なスワイプジェスチャがあります。ビューのコントロールで発生するイベントによってキャンセルされるようにしたい。最初は、これは簡単だと思いました。ジェスチャーが発生したときにイベントをキャンセルするのは簡単ですが、私はその逆を行うことができないようです。

私の解決策は、タッチ可能なものと競合する場合はジェスチャーをキャンセルすることです。これが私が一緒にハッキングしたコードです:

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
    CGPoint touch = [gestureRecognizer locationInView:self.view];
    return [self.view hitTest:touch withEvent:nil] == self.view;
}

これは問題の間違った解決策だと思います。私は何が欠けていますか?イベントを取得してジェスチャーをキャンセルする正しい方法は何ですか?


詳細については、2つのUISwipeGestureRecognizers(左にスワイプと右にスワイプ)をビューに追加しています。ビューにはUISliderもあります(埋め込まれたMPVolumeViewの一部)。スライダーを動かして音量を変えると、左右にスワイプすると発火します。

4

1 に答える 1

2

これはあなたがやりたいことをする正しい方法です。ジェスチャレコグナイザーに、タッチがビューに直接ある場合にのみ開始する必要があり、サブビューは開始しないように指示しています(これによるとhitTest:、ビューがヒットしたかどうかを判断できるため、これは適切です)。

後でキャンセルしようとするよりも、開始しないようにする方が常に適切です。ただし、ジェスチャの開始後にジェスチャをキャンセルする場合は、設定してから再度に戻りますenabled = NOYES

一部のサブビューに対してジェスチャを許可する必要があるが、コントロールは許可しない場合は、によって返されるビューが(たとえば)を使用してhitTest:のサブクラスであるかどうかをテストできます。UIControlisKindOfClass:

これがどのタイプのジェスチャであるかはわかりませんが、UIKitはタッチを必要とする最も深いビューを自動的に検出し、そのビューはそれらを「食べる」ので、外部のジェスチャ認識機能は検出しないため、通常はこれを行う必要はありません。それらを取得します-しかし、これはレコグナイザー/コントロールのいくつかの組み合わせには当てはまらないと想像できます。

于 2012-06-23T13:07:34.947 に答える