MILLEN BOX

音楽好きの組み込みソフトエンジニアによるプログラミング(主にiOSアプリ開発)の勉強の記録

GestureRecognizerを使用している場合の指を離した時の認識方法 [swift2.0][GestureRecognizer][.Ended]

以前、GestureRecognizer を使用してコスリ機能の検討をしたことがありました。

▶︎連打アプリをコスリ対応するには? [swift1.2] [GestureRecognizer] - MILLEN BOX

このコスリ機能自体は問題ないのですが、GestureRecognizer に処理を持って行かれている場合、touchesEnded で指を離したタイミングを検知できないことに気づきました。
GestureRecognizerで指を離したタイミングを認識するためにはどうしたらいいか の調査結果を備忘録として残しておきます。

Githubは以下です。

github.com

また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週間くらい時間がかかってしまいました。
同じような悩みを持ってられる方がこのページを見て助けになれば嬉しいです。