0

私は、同時に写真を挟んでパンすることができる写真アプリに似たインタラクションを再現しようとしています。タッチミッドパンの追加または削除は完全に機能します。ピンチとパンのジェスチャ認識器を同時に操作するときに、タッチ位置を変更するにはどうすればよいですか?

私のコードでは、タッチの位置を使用してビューを移動しています。私が2本の指でドラッグすると、パンジェスチャ認識機能が2本の指の間にポイントを置くが(それはすべきである)、指を持ち上げるとポイントがその1本の指のポイントに変わり、ビューが変わる。

maximumNumberOfTouchesを1に設定しても、finger1、pan、touch 2、pan、lift finger 1に触れることができず、finger 2の位置に動きます。 2本の指でパンすることができます。ピンを挟んでズームしたり、画像を回転させたりすることができます。

私は他の理由でこれにUIScrollViewを使用することはできませんが、その問題がないことはわかっています。

私が考えることのできる唯一の解決策は、最初のタッチ位置を取得し、その後指を追加または削除するたびに、古い位置に基づいて新しい位置をオフセットすることです。しかし、私はどのようにその情報を取得するか分からない。

このためのAPIはありますか?上記の方法が唯一の方法ですか、もしそうなら、どうしたらいいですか?

+0

UIGestureRecognizer 'location(in:)'はセントロイドです。タッチの場所ではありません。タッチの場所は 'location(ofTouch:in:)'またはUITouch 'location(in:)'です。 – matt

+0

私は知っています。しかし、それは基本的に私がデフォルトとして望むものです。私は以下の解決策を掲示した。あなたが何か良いことを知っているなら、私は知りたいです。 – EdwardSanchez

+0

問題は、パンジェスチャーに応答してビューをドラッグ可能にする正しい方法は、 '' location(in:) ''を使うことではないということです。あなたがそのようにしている限り、あなたは人生を不必要に複雑にしています。 – matt

答えて

0

これで解決しました。

ジェスチャー関数の中には、グローバル変数にタッチ位置が与えられています。状態において

self.touchInView.x = sender.location(in: superview).x - frame.origin.x self.touchInView.y = sender.location(in: superview).y - frame.origin.yself.touchInParent = sender.location(in: superview)

==私は、タッチの位置を設定OriginalTouchという変数を有する.began。

if gesture.state == .began { 
originalTouch = self.touchInView 
} 

そして状態で== Iは、タッチの数が変更された場合に検出及び計算.changedオフセット

//Reset original touch position if number of touch changes so view remains in the same position 
if sender.numberOfTouches != lastNumberOfTouches { 
    originalTouch.x += (touchInView.x - originalTouch.x) 
    originalTouch.y += (touchInView.y - originalTouch.y) 
} 

lastNumberOfTouches = sender.numberOfTouches 

が今は

self.frame.origin = touchInParent - originalTouch 
originalTouchに基づくビューの位置を設定することができ
1

私が理解しているように、問題は、ジェスチャ認識装置の(英語)のため、ユーザーが途中で指の数を変更した場合、パン(ドラッグ)に応答するコードが機能しないことです。がジャンプします。

問題は、コードの基礎となる基本的な前提がすべて間違っていることです。ビューをドラッグ可能にするには、ではなく、をチェックしてください。location(in:)を確認してください。 translation(in:)をチェックしてください。それがそれのためのものです。

@objc func dragging(_ p : UIPanGestureRecognizer) { 
    let v = p.view! 
    switch p.state { 
    case .began, .changed: 
     let delta = p.translation(in:v.superview) 
     var c = v.center 
     c.x += delta.x; c.y += delta.y 
     v.center = c 
     p.setTranslation(.zero, in: v.superview) 
    default: break 
    } 
} 

ユーザが複数の指で始まり、ドラッグ中にいくつかを持ち上げる場合でも正常に動作します:

これはパンジェスチャー認識を持つドラッグ可能なビューを作成するための標準的なパターンです。

関連する問題