0

私は、ほとんどのタッチ ジェスチャがパン ジェスチャになるアプリに取り組んでいます (ただし、パン ジェスチャ認識機能は使用していません)。、、、UIGestureRecognizerDelegateおよび を使用しています。ただし、画面上にいくつかのスポットがあり、そこでパンが開始された場合、代わりにタップ イベントとして認識したいと考えています。touchesBegan で位置を認識するだけでこれを行うことができます。私の質問は、パンの継続を防ぐために、その時点でタッチの割り当てを解除できますか? 画面内のこの位置からパンが開始された場合、ユーザーが実際にパンとして意図したものではないことが保証されます。これが理にかなっていることを願っています。touchesBegantouchesMovedtouchesEndedtouchesCancelled

編集:無視すべきポイントであっても、タップを管理する余分なオーバーヘッドは取るに足らないものであることに気付いたので、それを行うだけだと思います。ただし、ジェスチャーが追跡され続けるのを止める方法がある場合に備えて、ここで質問を続けます。

また、次の状況を処理する方法についての提案も必要です。

ユーザーが (先ほど説明した領域ではなく、実際にパンを意図した場所で) パンを開始し、パンの進行中に別のパンが画面上の別の場所で開始されたとします。この状況をどのように認識しますか?

編集:私は今、このコードがこの問題を解決するかどうかをテストしています:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
   return YES;
}

編集:ARCは明示的なdeallocを禁止しているため、質問をより一般的なものに修正し、もしあれば、それ以上のアクションを抑制するために何ができるか. それとも、私はそれに対処する必要がありますか?

4

4 に答える 4

1

UIGestureRecognizerDelegate メソッドが必要で、gestureRecognizer:shouldReceiveTouch: . 1 つが既に進行中のときに 2 番目のパンがいつ開始されるかを認識することに関しては、ジェスチャ レコグナイザーがタッチの認識を開始するときに設定した状態変数を試すことができます。

于 2012-12-18T17:55:58.617 に答える
0

これが私が使用した解決策です。

タップを認識するには、単純に でタッチ オブジェクトの座標を比較し、座標が同じか、わずかに移動した場合にタップと見なしますtouchesBegan。ほぼ同じ場所で開始および終了するが、その間を移動するタッチがアプリで発生する可能性は非常に低いため、touchesEnded無視します。touchesMoved

最初のパンが開始された後に 2 番目のパンを認識するために、タッチ オブジェクトを追跡します。このシナリオでは、最初と 2 番目のパンが 2 つの異なるタッチ オブジェクトを取得します。私はもともと座標を追跡し、現在の場所と以前の場所を一致させるデイジーチェーンをたどっていましたが、何らかの理由で2回目のタッチが最初のタッチとは異なる動作をするため、うまくいきませんでした。とにかく、タッチ オブジェクトの追跡は簡単です。コードに関する限り、2 番目のタッチ オブジェクトが最初のタッチ オブジェクトと同時に発生するかどうかは「わかりません」。

于 2012-12-22T03:55:16.047 に答える
0

あなたの質問を完全に理解しているかどうかはわかりませんが、おそらくこれが役立つでしょう:

最初に: ARC では、何も解放しようとすべきではありませんが、ジェスチャーを無効にすることはできます。たとえば、ジェスチャに panGesture という名前を付けた場合、次のようにすることができます。

panGesture.enabled = NO;

割り当てと解放を試みる代わりに、有効にして無効にするだけです。

2 つ目: パン ジェスチャの動きを追跡できます。IBAction メソッドでは、最初のタッチの座標をキャプチャしてから、これをパンとしてカウントするか、ジェスチャの開始位置に基づいてタッチとしてカウントするかを決定できます。

パン ジェスチャの詳細については、こちらをご覧になることをお勧めします。

iOS 5 の UIGestureRecognizer チュートリアル: ピンチ、パンなど

そしてもちろん、ここに:

iOS のイベント処理ガイド: ジェスチャ レコグナイザー

于 2012-12-18T17:25:09.900 に答える
0

いいえ、割り当てを解除することはできず、とにかく機能しません


GestureRecognizer を使用しているため、それをキャンセルできます

@interface UIGestureRecognizer (Cancel)
- (void)cancel;
@end

@implementation UIGestureRecognizer (Cancel)
- (void)cancel
{
    self.enabled = NO;
    self.enabled = YES;
}
@end

また

タッチをキャンセルする必要があります...しかし、これまではそれを行うためのプライベートAPIしかありませんでした。あなたの最善の策は、 _isCanceled のようなクラスのブール値を設定することです

touchesBegan で NO にリセットし、タッチ処理を終了したい場合は YES に設定します。

また

キャンセルしたいタッチをクラスに保存する NSSET に保存し、それらのタッチを無視することができます

于 2012-12-18T17:31:05.970 に答える