上記のサイト様を参考にさせていただきました。
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
}
}