質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

900閲覧

longPressGestureとpanGestureを同時に検知したいです

退会済みユーザー

退会済みユーザー

総合スコア0

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2018/06/27 15:34

前提・実現したいこと

長押しでViewを作成し,指をドラッグするとそのViewも移動させたいです.
その前段階として,ドラッグ中に座標を取得したいです.

swift

1 override func viewDidLoad() { 2 super.viewDidLoad() 3 4 // ロングプレス 5 let longPressGesture = 6 UILongPressGestureRecognizer(target: self, 7 action: #selector(HeadItemViewController.longPress(_:))) 8 longPressGesture.delegate = self 9 //パン 10 let panGesture = UIPanGestureRecognizer(target: self, action: #selector(HeadItemViewController.panView(sender:))) 11 panGesture.delegate = self 12 13 // Viewに追加. 14 self.collectionView.addGestureRecognizer(longPressGesture) 15 self.collectionView.addGestureRecognizer(panGesture) 16 } 17 18 19@objc func longPress(_ sender: UILongPressGestureRecognizer){ 20 21 if sender.state == .began { 22 print("LongPress began") 23 } 24 else if sender.state == .ended { 25 print("Longpress ended") 26 } 27 } 28 29 @objc func panView(sender: UIPanGestureRecognizer) { 30 //移動後の相対位置を取得 31 let location: CGPoint = sender.translation(in: self.view) 32 print(location) 33 }

理想はこれで,コンソールに
LongPress began
〜ドラッグ中の座標〜
Longpress ended
と表示されることです.

現時点での現象

長押しを検知した場合に,panGestureが起動されず座標が取得できません.
長押しが行われてないときには,pangestureは起動しx,y座標共に取得できます.

https://stackoverflow.com/questions/28698522/swift-pan-longpress-recognizers-simultanously?answertab=active#tab-top

の方のように,同時検出の方法を試しましたが,これだと両方のジェスチャーが検知されなくなってしまいました.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

質問タイトルに対するズバリの回答ではないのですが、UILongPressGestureRecognizerが検知された後(.began.ended間)で指をスワイプしたりすると、state.changedとして通知されますので、それを処理すれば希望する動きを実現できるのではないかと思います。

長押し検出時のスワイプの動作テスト:

swift

1import UIKit 2 3class ViewController: UIViewController { 4 5 override func viewDidLoad() { 6 super.viewDidLoad() 7 8 view.addGestureRecognizer(UILongPressGestureRecognizer(target: self, action: #selector(longPress))) 9 } 10 11 @objc private func longPress(_ sender: UILongPressGestureRecognizer) { 12 switch sender.state { 13 case .began: 14 print("long press begin: (sender.location(in: view))") 15 case .changed: 16 print("long press changed: (sender.location(in: view))") 17 case .ended, .cancelled: 18 print("long press end or cancelled: (sender.location(in: view))") 19 default: 20 break 21 } 22 } 23}

また、基本的な事ですが、UILongPressGestureRecognizerでもUIPanGestureRecognizerでも、
キャンセルされる事がありますので、state.cancelledだった場合の事も考慮してください。
(例えばスワイプ中にホームボタンを押せばキャンセルが通知されます。)

投稿2018/06/28 02:24

編集2018/06/28 02:27
takabosoft

総合スコア8356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/06/29 00:56

ありがとうございました! ジェスチャーを追加しなくても検知できたこと, キャンセル時に処理をわかっていませんでした. まだまだ,基本的なことすらわかっていないので有り難いです.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問