web-dev-qa-db-ja.com

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

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

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シミュレータでスワイプをシミュレートするにはどうすればよいですか?
121
JAM

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

デフォルトでは、2つのレコグナイザーが同じジェスチャを認識しないため、パンとスワイプの間に競合があります。最も可能性が高いのは、ジェスチャがよりシンプルでより一般的であるため、パンレコグナイザーが競合に「勝つ」ことです。

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

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

224
rickster

スワイプジェスチャは、特定の方向(上にスワイプ、下にスワイプ、左にスワイプ、右にスワイプ)でのみ指をドラッグすると機能します。たとえば、Table View Controllerのスワイプ可能なセル。

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

27
Daya Kevin

Appleドキュメントに従って。 Apple UIPanGestureRecognizer 以下のようなパンとスワイプの違い:-

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

パン操作は継続的です。指の最小数が許可されたときに(began)が始まります(minimumNumberOfTouches )パンと見なされるほど移動しました。少なくとも最小数の指を押し下げたまま指を動かすと、変化(変更)します。すべての指が持ち上げられると終了します(ended)。

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

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
    }
  }
}

Appleドキュメントに従って。 Apple UITapGestureRecognizer

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

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

Swift 3 UITapGestureRecognizerデモの例リソースリンク

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のサンプル画像enter image description here

0
Rex

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

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

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

0
JasmineOT