13

現在、ドラッグジェスチャを追跡しているとします。私のイベントハンドラーでは、しきい値を使用して、ドラッグによってアクションが発生するタイミングを決定します。しきい値を超えたら、ドラッグジェスチャが完了したことを示したいと思います。

私がドキュメントで見つけることができる唯一のものはここのこの行です

ジェスチャレコグナイザが現在ジェスチャを認識しているときにこのプロパティをNOに変更すると、ジェスチャレコグナイザはキャンセル状態に移行します。

それで:

if (translation.y > 100) {
    // do action
    [self doAction];

    //end recognizer
    sender.enabled = NO;
    sender.enabled = YES;
}

これは機能しますが、より適切な方法があるようです。

ジェスチャーがプログラムで終了したことを示す別の方法を知っている人はいますか?-end:状態で最終イベントを生成するメソッドのようなものを期待しますUIGestureRecognizerStateEnded

4

2 に答える 2

15

カスタムUIGestureRecognizerを定義しましたか?認識しているジェスチャが、しきい値が異なるか、通常のUIPanGestureRecognizerと同じではないために、Appleによって定義された標準のジェスチャと異なる場合は、独自のUIGestureRecognizerを作成することが理にかなっている場合があります。(サブクラス化に関する注意事項を参照してください

UIGestureRecognizerをサブクラス化した場合は、次のように状態を設定するだけです。

  self.state = UIGestureRecognizerStateEnded;

touchesMoved:withEvent:メソッドでこれを実行することをお勧めします。また注意してください:

「UIGestureRecognizerのサブクラスはUIGestureRecognizerSubclass.hをインポートする必要があります。このヘッダーファイルには、読み取り/書き込みを可能にする状態の再宣言が含まれています。」

一方、UIGestureRecognizerDelegateのみを実装している場合、状態は読み取り専用であり、直接設定する方法はありません。その場合、無効化/有効化する方法が最善の方法である可能性があります。

于 2012-09-05T20:16:29.503 に答える
5

示したコードでは、ジェスチャレコグナイザーがキャンセルされたときにアニメーションを開始するためのロジックが必要です。アニメーションを実行せずにこのジェスチャレコグナイザーをキャンセルできる方法は他にもあるため、これは適切ではないと思います。 。

アニメーションを開始するためのメソッドがあることを考えると、しきい値を超えたとき、およびジェスチャが正常に終了したときに、このメソッドを呼び出す必要があります。その後、2つの異なる機会。提示したコードは次のようになります。

if (translation.y > 100) {
    // do action
    [self finishFlip];
    sender.enabled = NO;
    sender.enabled = YES;
}

ここでジェスチャをキャンセルすると、ユーザーが指をドラッグし続けた場合に後続のアクションが妨げられる場合にも役立つことがあります。

これを開発するチームがあり、特定のイベントを発生させる必要がある場合は、ジェスチャレコグナイザーを提案されていないものとしてサブクラス化する必要があります。

于 2012-09-06T06:56:55.690 に答える