まだどこにもないアプリを作る

アプリ開発でつまづいたところなどを中心に記事にして行きます。

Swift5 UIKit セルをロングタップして検知 セルのインデックス番号も取得できる方法

teratail.com

上記のサイト様を参考にさせていただきました。

 

swift5 cellをロングタップした時の動作

 

 

override func viewDidLoad() {

        super.viewDidLoad()

//セルのロングタップジェスチャー

        let longPressRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(rowButtonAction(_:)))

        longPressRecognizer.allowableMovement = 15

        longPressRecognizer.minimumPressDuration = 0.5

        tableView1.addGestureRecognizer(longPressRecognizer)

 

@objc func rowButtonAction(_ sender: UILongPressGestureRecognizer) {

        let point: CGPoint = sender.location(in: tableView1)

        let indexPath = tableView1.indexPathForRow(at: point)

        if let indexPath = indexPath {

            if sender.state == UIGestureRecognizer.State.began {

                // セルが長押しされたときの処理

                print("long pressed \(indexPath.row)")

            }

        }else{

            print("long press on table view")

        }

    }

 

このやり方はtableViewにおいてタップしたところの座標をもとにセル番号を検知しているようです。

座標からなんて荒いやり方だな、と思いましたが

それ用のApple公式のメソッドがあるので正確にインデックスが取得できます。

 

 

ちなみにただセルにロングタップジェスチャーをつけたいだけだったら以下の書き方もできます。このやり方でindex番号を取得することは私は断念しました。

cellForRowAt内に以下のコード

//セルに長押し検知機能 

                let recognizer = UILongPressGestureRecognizer(target: self, action: #selector(onLongPressCell(_:)))

                recognizer.minimumPressDuration = 0.5

                cell.contentView.isUserInteractionEnabled = true

                cell.contentView.addGestureRecognizer(recognizer)

 

関数かく場所に以下のコード

//MARK: セル ロングタップの時の動作

    @objc func onLongPressCell(_ sender: UILongPressGestureRecognizer) {

        print("セルロングタップの時の動作")

        var onceLongTapNum = 0

        if sender.state == .began {

            onceLongTapNum += 1//何回も反応してしまうのを防ぐ

            if onceLongTapNum == 1{

                print("ロングタップ")

            }

        }else if sender.state == .ended {

            onceLongTapNum = 0

        }

    }