GestureRecognizerを使用している場合の指を離した時の認識方法 [swift2.0][GestureRecognizer][.Ended]
以前、GestureRecognizer を使用してコスリ機能の検討をしたことがありました。
▶︎連打アプリをコスリ対応するには? [swift1.2] [GestureRecognizer] - MILLEN BOX
このコスリ機能自体は問題ないのですが、GestureRecognizer に処理を持って行かれている場合、touchesEnded で指を離したタイミングを検知できないことに気づきました。
GestureRecognizerで指を離したタイミングを認識するためにはどうしたらいいか の調査結果を備忘録として残しておきます。
Githubは以下です。
▶︎GitHub - anthrgrnwrld/panTest2
またGestureRecognizerについては以下を参照下さい。
▶︎040 GestureRecognizerのイベント取得 - Swift Docs
自分ポイント
GestureRecognizerはこんな感じでviewDidLoad辺りで定義されていますよね。
let myTap = UIPanGestureRecognizer(target: self, action: "didPan:") self.button.addGestureRecognizer(myTap)
呼び出されるactionとして didPan が指定されています。
didPanは以下とします。
func didPan(sender: AnyObject) { println("\(__FUNCTION__) is called!") if let pan = sender as? UIPanGestureRecognizer { let p = pan.locationInView(self.view) if !inButton && self.button.frame.contains(p) //ここの処理の意味については http://anthrgrnwrld.hatenablog.com/entry/2015/09/04/203149 を確認して下さい { count++ inButton = !inButton self.label.text = "\(count)" }else if inButton && !self.button.frame.contains(p) { inButton = !inButton } } }
didPan には引数としてsenderというパラメーターがあります。
指が離された時には sender.state が .Ended という状態になることが分かりました。
よって指が離されたことを知りたければ、以下のようにif分岐を追加すればよいわけです。
func didPan(sender: AnyObject) { if let pan = sender as? UIPanGestureRecognizer { let p = pan.locationInView(self.view) if !inButton && self.button.frame.contains(p) { count++ inButton = !inButton self.label.text = "\(count)" // }else if inButton && !self.button.frame.contains(p) { inButton = !inButton } else if sender.state == .Ended { //追加部分 print("\n\nPressing is finished!!!!!!!\n") } } }
これ、ハマってしまって謎解きまで約1週間くらい時間がかかってしまいました。
同じような悩みを持ってられる方がこのページを見て助けになれば嬉しいです。