仕様としてはめっちゃ使うやーつなのに、デフォルトでは実装されていない長押し機能さん。
結構サクサクっと実装できちゃうので、容易に使い回すためにも残しておこうと思います。
開発環境(前提条件)
・Xcode11.5
・Swift5
実装方法
UITableViewCell や UICollectionViewCell などのセルに実装するパターンが見受けられますが、セルの数が膨大な場合はよくないので、UITableView や UICollectionView に追加する方法を採用しましょう。
コード内では UICollectionView に追加する方法を書き記しますが、UITableView でもほぼほぼ同じです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
class ViewController: UIViewController { . . . override func viewDidLoad() { let longPressGesture = UILongPressGestureRecognizer(target: self, action: #selector(longPressGesture(_:))) longPressGesture.minimumPressDuration = 0.5 longPressGesture.delegate = self self.collectionView.addGestureRecognizer(longPressGesture) } } //MARK: - PrivateMethod extension ViewController { @objc private func longPressGesture(_ sender: UILongPressGestureRecognizer) { guard sender.state == .began, sender.state != .changed, let indexPath = self.collectionView.indexPathForItem(at: sender.location(in: self)) else { return } // 長押ししたセルの indexPath が取得できる } } //MARK: - UIGestureRecognizerDelegate extension ViewController: UIGestureRecognizerDelegate { func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { return gestureRecognizer.shouldRequireFailure(of: otherGestureRecognizer) } } |
これだけッ
セルに毎回 addGestureRecognizer(_:) するとコード的にもメモリ的にも無駄パーティ開催しちゃうので、大元である UITableView や UICollectionView に一度だけ addGestureRecognizer(_:) する感じにして、ちょいエコ感を出しています。
さいごに
この長押し機能ってデフォルトの機能でもいいと思うけどなぁ
SwiftUI とかだと実装されてたりするのかな…まだ深く触ってないから知らんけど。
コメント