2017-08-01 2 views
2

SwiftにUIPanGestureRecognizerを使用した場合、私は奇妙なケースがあります。 私はパンのジェスチャーを処理し、他のジェスチャーがパンと干渉しないようにUIGestureRecognizerDelegateに "false"を指定する関数を持っています。recognizer.location(in:recognizer.view)は、スウィフトでポイント0を返します。

ここで問題の場合は次のとおり

  1. ユーザが1本の指でタッチし、
  2. ユーザーのパンを開始する画面上の第2の指を置く - 第二のフィンガが無視さ
  3. ユーザが最初に指を持ち上げます2番目はまだ触っています - この時点で私のハンドラは recognizer.state == .endedで呼び出されます。問題は、私はrecognizer.location(in: recognizer.view)を呼び出すことによって取得し、この時点での場所は(、(0,0)

アム私はポイントを得るために間違った方法を使用してポイントを返すということです?第二指が完全に無視されますので、ということらしいです最初の指は、通常のパンのように振る舞うべきではない、と状態が==終わったとき、私は場所を得るでしょう、私はちょうどそれをテスト

答えて

0

- 。、認識が終了したときの場所が使用できなくなっている

(以下使用します)
recognizer.location(ofTouch: 0, in: recognizer.view) 

トラッキングする変数を追加します.changed .began &で最後の既知のポイントは、(私は戻って、それらのデータを取得する)、その後にそのデータを使用し.ended

EDIT:あなたの実装

に戻っ

class pgr: UIPanGestureRecognizer { 
    var myTouch:Set<UITouch>! 

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent) { 
     myTouch = touches 
     super.touchesEnded(touches, with: event) 
    } 

} 

そして、サブクラス化してからデータを取得します

if sender.state == .ended { 
     print(sender.myTouch.first?.location(in: sender.view)) 
    } 
+0

利用できないと文書化されていますか?私はあなたが解決策として言ったことを使用しましたが、それがベストプラクティスであるかどうか疑問です – gbehar

+0

UIGestureRecognizerをチェックすると、その情報を取得する唯一の方法です(タッチはありません):にアクセスできます - 私はそれがUIViewに属していると思っています。それは私が気づいていないことをするためには、より巧妙な方法かもしれません。 – solenoid

+0

UIViewは、独自のオーバーライドfunc touchesEnded(_タッチ:イベントを設定します。 – solenoid

関連する問題