【Xcode/Swift】タップ & 長押しを認識させよう

今回は特定のパーツがタップ & 長押しされた時にイベントを起こすための処理を紹介します。

Storyboard

画像ファイルはテキトーなもの入れておけばOKです。


コーディング

import UIKit

class HomeViewController: UIViewController {

    @IBOutlet private weak var imageView: UIImageView!
    @IBOutlet private weak var tapLabel: UILabel!

    private var shortCount = 0
    private var longCount = 0

    override func viewDidLoad() {
        super.viewDidLoad()
        setupTapGesture()
    }

    private func setupTapGesture() {
        // 通常タップ用
        let tapGesture: UITapGestureRecognizer = UITapGestureRecognizer(
            target: self,
            action: #selector(HomeViewController.tapped(_:)))
        tapGesture.delegate = self
        self.view.addGestureRecognizer(tapGesture)

        // ロングタップ用
        let longPressGesture = UILongPressGestureRecognizer(target: self, action: #selector(HomeViewController.longPress(_:)))
        longPressGesture.delegate = self
        self.view.addGestureRecognizer(longPressGesture)
    }

}

extension HomeViewController: UIGestureRecognizerDelegate {
    // 通常タップイベント
    @objc func tapped(_ sender: UITapGestureRecognizer) {
        if sender.state == .ended {
            shortCount += 1
            tapLabel.text = "\(shortCount)回タップされたよ"
            if shortCount == 5 {
                imageView.image = UIImage(named: "BigWave")
            }
        }
    }

    // ロングタップイベント
    @objc func longPress(_ sender: UILongPressGestureRecognizer) {
        // ロングタップ開始時
        if sender.state == .began {
            longCount += 1
            tapLabel.text = "\(longCount)回ロングタップされたよ"
        }
        // 指が離れた時
        else if sender.state == .ended {
            print("Long Press終了")
        }
    }

}