iOSのパンとスワイプの違いは何ですか?


129

簡単に聞こえます.. トラックパッドを押したまま、指を動かして、離してください ..しかし、どういうわけかスワイプがトリガーされていません(代わりにパンがトリガーされます)

UISwipeGestureRecognizer *swipeGesture = [[UISwipeGestureRecognizer alloc] 
      initWithTarget:v action:@selector(handleSwipe:)];
swipeGesture.direction= UISwipeGestureRecognizerDirectionUp;
[v addGestureRecognizer:swipeGesture];

代わりに、パンは上記のシーケンスによって認識されます。

UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] 
      initWithTarget:v action:@selector(handlePan:)];
[v addGestureRecognizer: panGesture];

パンがコメントされている場合、スワイプは同じジェスチャーで認識されます。これにより、2つの質問:

  • パンとスワイプの違いは何ですか?
  • iPhoneシミュレーターでスワイプをシミュレートするにはどうすればよいですか?

1
@rickster、私が間違っている場合は修正してください。ただし、スワイプは上下左右の4方向を使用し、パンはどの方向でもかまいません。正しい
ビクターエンゲル

回答:


231

定義により、スワイプジェスチャは必ずパンジェスチャでもあります。どちらもタッチポイントの並進移動を伴います。違いはレコグナイザのセマンティクスにあります。パンレコグナイザは並進運動の開始を探し、時間の経過とともに任意の方向の動きを報告し続けますが、スワイプレコグナイザは、ユーザーのタッチが必要な方向に直線的に移動したかどうかを瞬時に決定します。

デフォルトでは、2つの認識機能が同じジェスチャーを認識することはないため、パンとスワイプの間で競合が発生します。最も可能性が高いのは、パンの認識機能がジェスチャーが単純/より一般的であるため、競合に「勝ち」ます。スワイプはパンですが、パンはスワイプではない可能性があるため、パンが最初に認識し、他の認識機能を除外します。

デリゲートメソッドを使用してgestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:、またはおそらくデリゲートなしでパンレコグナイザをスワイプレコグナイザに依存させることにより、この競合を解決できるはずrequireGestureRecognizerToFail:です。

競合が解決されたら、マウスをすばやくドラッグして、1本指でのスワイプをシミュレートできます。(マウスは指よりも正確ですが、デバイス上で実際に行うよりも少し細心の注意が必要です。)2本指でのパン/スワイプは、OptionキーとShiftキーを押すことで実行できます。


24
素敵な答え。しかし、パンジェスチャーの方が一般的だからと言って勝つとは思いません。むしろ、連続ジェスチャー(スワイプが個別のジェスチャーの場合)であるため、スワイプの前にパンが認識されます。スワイプは指を上げたときにだけ認識され、パンは指が動き始めた直後に認識されます。スワイプとパンの違いについては、イベントPGの「2つのジェスチャー認識機能の特定の順序を宣言する」で詳しく説明しています。
nevan king 2013

27

スワイプジェスチャーは、指を特定の方向にのみドラッグしたときに機能します(上にスワイプ、下にスワイプ、左にスワイプ、右にスワイプ)。たとえば、テーブルビューコントローラーのスワイプ可能なセル。

パンジェスチャーは、指を任意の方向にドラッグすると機能します。あなたはそれに加速または減速を与えることができます。たとえば、オブジェクトをある場所から別の場所に移動したり、スピナーを回転させたりします。


3

アップルのドキュメントによると。Apple UIPanGestureRecognizerパンとスワイプの違いは次のとおりです:-

UIPanGestureRecognizerは、パン(ドラッグ)ジェスチャを探すUIGestureRecognizerの具象サブクラスです。ユーザーは、ビューをパンしている間、ビュー上で1本以上の指を押している必要があります。このジェスチャレコグナイザのアクションメソッドを実装するクライアントは、ジェスチャの現在の変換と速度を要求できます。

パンのジェスチャーは継続的です。許可される指の最小数(minimumNumberOfTouches)がパンと見なされるのに十分なだけ移動したときに開始されます。最小数以上の指を押したまま指を動かすと変化(変化)します。これは、(終了終了し、すべての指が持ち上げられたとき)。

このクラスのクライアントは、アクションメソッドで、ジェスチャの現在の変換(translation(in :))および変換の速度(velocity(in :))をUIPanGestureRecognizerオブジェクトに照会できます。座標系を移動と速度の値に使用するビューを指定できます。クライアントは、変換を希望の値にリセットすることもできます。

Swift 3 UIPanGestureRecognizerデモの例:- リソースリンク

import UIKit

class ViewController: UIViewController {
// this records our circle's center for use as an offset while dragging
var circleCenter: CGPoint!

override func viewDidLoad() {
    super.viewDidLoad()

    // Add a draggable view
    let circle = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 100.0, height: 100.0))
    circle.center = self.view.center
    circle.layer.cornerRadius = 50.0
    circle.backgroundColor = UIColor.green()

    // add pan gesture recognizer to
    circle.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: #selector(self.dragCircle)))

    self.view.addSubview(circle)
}

func dragCircle(gesture: UIPanGestureRecognizer) {
    let target = gesture.view!

    switch gesture.state {
    case .began, .ended:
        circleCenter = target.center
    case .changed:
        let translation = gesture.translation(in: self.view)
        target.center = CGPoint(x: circleCenter!.x + translation.x, y: circleCenter!.y + translation.y)
    default: break
    }
  }
}

アップルのドキュメントによると。アップルUITapGestureRecognizer

UITapGestureRecognizerは、単一または複数のタップを探すUIGestureRecognizerの具象サブクラスです。ジェスチャーが認識されるためには、指定された数の指がビューを指定された回数タップする必要があります。

タップは個別のジェスチャーですが、ジェスチャー認識機能の状態ごとに個別です。したがって、関連付けられたアクションメッセージは、ジェスチャが開始すると送信され、ジェスチャの終了状態まで(およびそれを含む)中間状態ごとに送信されます。したがって、タップジェスチャを処理するコードは、ジェスチャの状態をテストする必要があります。

Swift 3 UITapGestureRecognizer Demoサンプル リソースリンク

override func viewDidLoad() {
   super.viewDidLoad()

   let tap = UITapGestureRecognizer(target: self, action: #selector(doubleTapped))
   tap.numberOfTapsRequired = 2
   view.addGestureRecognizer(tap)
}
func doubleTapped() {
     // do something cool here
     print("Test TapGesture")
}

Recognizerの画像の例ここに画像の説明を入力してください


問題は、パンアクションとスワイプアクションの違いと、iPhoneシミュレーターでそれらを区別する方法です。この回答では、スワイプジェスチャーやiPhoneシミュレータについては触れられていないため、これらの問題については取り上げていません。
ビンス・オサリバン

@ VinceO'Sullivanパンとスワイプの定義を説明しようと思います。両者の違いを理解していただければ幸いです。
レックス

元の投稿は5年前のもので、回答は承認されています(投票数は約200です)。私はあなたが追加するのに役立つものは何もないと思います(物事が現在どのように機能するか、それらが受け入れられた回答でどのように機能したかの間で違いがない限り)。
Vince O'Sullivan 2017年

@ VinceO'Sullivan簡単な例とアップルのドキュメント定義を使って簡単に説明します。iOSのタッチパターンを示すトピックと画像の両方に重点を置いていると思います。
レックス

0

http://hammerjs.github.io/によると、違いは次のとおりだと思います:

  • パン:同じ大きなビューで方向を移動します
  • スワイプ:複数のビューを切り替えます

ジェスチャーは同じで、どちらも1本の指で動かします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.