63

わかりましたので、マルチタッチ ジェスチャをキャプチャするために太陽の下でほぼすべてのオプションを調べてきましたが、ようやく一周して UIPanGestureRecognizer に戻ってきました。

私が欲しい機能は本当にとてもシンプルです。2 本指のパン ジェスチャをセットアップしました。移動するピクセル数に応じて、いくつかの画像をシャッフルできるようにしたいと考えています。すべてうまくいきましたが、パンジェスチャが逆の場合にキャプチャできるようにしたいと考えています。

ジェスチャーに戻ることを検出するために私が見ていない組み込みの方法はありますか? 元の開始点を保存してから、終点を追跡し、その後どこに移動するかを確認し、最初の終点よりも小さいかどうかを確認し、それに応じて逆にする必要がありますか? 私はそれがうまくいっているのを見ることができますが、もっとエレガントな解決策があることを願っています!!

ありがとう

編集:

これは、レコグナイザーが起動するように設定されているメソッドです。ちょっとハックですが、うまくいきます:

-(void) throttle:(UIGestureRecognizer *) recognize{

throttleCounter ++;

if(throttleCounter == 6){
    throttleCounter = 0;
    [self nextPic:nil];
}

UIPanGestureRecognizer *panGesture = (UIPanGestureRecognizer *) recognize;
UIView *view = recognize.view;
if(panGesture.state == UIGestureRecognizerStateBegan){
    CGPoint translation = [panGesture translationInView:view.superview];
    NSLog(@"X: %f, Y:%f", translation.x, translation.y);
}else if(panGesture.state == UIGestureRecognizerStateEnded){
    CGPoint translation = [panGesture translationInView:view.superview];
            NSLog(@"X: %f, Y:%f", translation.x, translation.y);
}
  }

値の違いを追跡しようとするところまで来ました...どちらの方向にパンしているかを確認しようとしています

4

3 に答える 3

180

UIPanGestureRecognizer では、 -velocityInView:を使用して、ジェスチャーが認識されたときの指の速度を取得できます。

たとえば、右側のパンで 1 つのことを行い、左側のパンで 1 つのことを行いたい場合は、次のようにすることができます。

- (void)handleGesture:(UIPanGestureRecognizer *)gestureRecognizer
{
    CGPoint velocity = [gestureRecognizer velocityInView:yourView];

    if(velocity.x > 0)
    {
        NSLog(@"gesture went right");
    }
    else
    {
        NSLog(@"gesture went left");
    }
}

新しい速度を古い速度と比較して、それがちょうど反対方向にあるかどうかを確認したい場合のように、文字通り反転を検出したい場合は、どちらの方向であっても、次のようにすることができます。

// assuming lastGestureVelocity is a class variable...

- (void)handleGesture:(UIPanGestureRecognizer *)gestureRecognizer
{
    CGPoint velocity = [gestureRecognizer velocityInView:yourView];

    if(velocity.x*lastGestureVelocity.x + velocity.y*lastGestureVelocity.y > 0)
    {
        NSLog(@"gesture went in the same direction");
    }
    else
    {
        NSLog(@"gesture went in the opposite direction");
    }

    lastGestureVelocity = velocity;
}

掛け算と足し算は少し奇妙に見えるかもしれません。実際には内積ですが、ジェスチャが同じ方向にある場合は正の数になり、正確に直角の場合は 0 になり、逆の場合は負の数になりますのでご安心ください。方向。

于 2011-03-03T22:47:55.823 に答える
15

ジェスチャ レコグナイザが開始する前に簡単に検出できるものを次に示します。

public override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
    guard let panRecognizer = gestureRecognizer as? UIPanGestureRecognizer else {
        return super.gestureRecognizerShouldBegin(gestureRecognizer)
    }

    // Ensure it's a horizontal drag
    let velocity = panRecognizer.velocity(in: self)
    if abs(velocity.y) > abs(velocity.x) {
        return false
    }
    return true
}

垂直方向のみのドラッグが必要な場合は、xとを切り替えることができますy

于 2016-05-03T22:22:13.613 に答える