【2024年4月】弊社では、基本リモートワークで一緒に成長してくださるメンバーを広く募集させていただいております。 詳細はこちら

【Swift】長押し(UILongPressGestureRecognizer)を検知した時の処理を実装する方法をサンプルコードを示しながら解説!

【Swift】長押し(UILongPressGestureRecognizer)を検知した時の処理を実装する方法をサンプルコードを示しながら解説!
ふくしま

こんにちは!株式会社メモリアインクのふくしまです!

この記事では、Swiftにおいて長押しジェスチャーを検知するためのUILongPressGestureRecognizerについて具体的なサンプルコードを示しながら解説します。

この記事を読んで分かること…
・UILongPressGestureRecognizerとは?
・UILongPressGestureRecognizerの基本的な使い方
・UILongPressGestureRecognizerのカスタマイズ方法

目次

UILongPressGestureRecognizerとは

UILongPressGestureRecognizerとは、ユーザーが画面上の特定の要素を長押ししたときにイベントを検知するためのジェスチャーレコグナイザーです。

UILongPressGestureRecognizerの基本的な使い方

概要

ここでは、UILongPressGestureRecognizerを使用して、ユーザーが画像を長押ししたときにアラートダイアログを表示する基本的な実装方法について説明します。

サンプルコード: 基本的な使い方

import UIKit

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 画像ビューの設定
        let imageView = UIImageView(image: UIImage(named: "myImage"))
        imageView.isUserInteractionEnabled = true // ユーザーのインタラクションを有効にする
        imageView.frame = CGRect(x: 100, y: 100, width: 200, height: 200)
        self.view.addSubview(imageView)
        
        // 長押しジェスチャーの初期化と追加
        let longPressRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(handleLongPress(_:)))
        imageView.addGestureRecognizer(longPressRecognizer)
    }
    
    @objc func handleLongPress(_ gestureRecognizer: UILongPressGestureRecognizer) {
        if gestureRecognizer.state == .began {
            // 長押しされたときの処理をここに記述
            let alertController = UIAlertController(title: "画像の保存", message: "この画像を保存しますか?", preferredStyle: .alert)
            
            let saveAction = UIAlertAction(title: "はい", style: .default) { (action) in
                // 画像を保存する処理(ここではシミュレーションのためコンソールに出力するだけ)
                print("画像を保存しました。")
            }
            
            let cancelAction = UIAlertAction(title: "キャンセル", style: .cancel, handler: nil)
            
            alertController.addAction(saveAction)
            alertController.addAction(cancelAction)
            
            // アラートを表示
            self.present(alertController, animated: true, completion: nil)
        }
    }
}

サンプルコードの説明

◾️行8-12: UIImageViewを作成し、画像を設定してビューに追加します。
isUserInteractionEnabledプロパティをtrueに設定して、ユーザーのインタラクション(この場合は長押し)を受け付けるようにします。
◾️行14-16: UILongPressGestureRecognizerを初期化し、それを画像ビューに追加します。このジェスチャーレコグナイザーは、指定されたターゲット(self)とアクション(handleLongPress:メソッド)を使用して長押しを検知します。
◾️行19-36: handleLongPressメソッドを定義します。このメソッドは、長押しジェスチャーが検知されたときに呼び出されます。
◾️行20-35: 長押しが検知された(.began状態)ときに実行される処理を記述します。UIAlertControllerを使用してアラートダイアログを表示し、ユーザーに画像の保存を選択させます。”はい”を選択するとコンソールに”画像を保存しました”と表示され、”キャンセル”を選択すると何も起こりません。

動作確認

【Swift】長押し(UILongPressGestureRecognizer)を検知した時の処理を実装する方法をサンプルコードを示しながら解説!

長押しの最小持続時間と許容移動量の設定

サンプルコード

        // 長押しジェスチャーの初期化
        let longPressRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(handleLongPress(_:)))
        
        // 最小持続時間のカスタマイズ(例: 2秒)
        longPressRecognizer.minimumPressDuration = 2
        
        // 許容移動量のカスタマイズ(例: 15ポイント)
        longPressRecognizer.allowableMovement = 15
        
        // 許容移動量のカスタマイズ(例: 15ポイント)     
        imageView.addGestureRecognizer(longPressRecognizer)

サンプルコードの説明

◾️行5:最小持続時間のカスタマイズ
minimumPressDurationプロパティに値を設定することで、長押しとして検知されるまでの最小時間を指定できます。この例では、最小持続時間を2秒に設定しています。これは、ユーザーが長押し操作を意図しているとアプリが判断するまでの時間を長くするため、誤操作を減らすことができます。
◾️行8:許容移動量のカスタマイズ:
allowableMovementプロパティに値を設定することで、長押し中に指が動ける最大距離を指定できます。この例では、許容移動量を15ポイントに設定しています。これにより、ユーザーが画面を長押ししている間にわずかに指を動かしても、ジェスチャーがキャンセルされないようになります。この値を調整することで、長押しの検知の厳密さをコントロールできます。

タッチイベントのイベントハンドリング設定

サンプルコード

import UIKit

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let view = UIView()
        view.backgroundColor = .red
        view.frame = CGRect(x: 100, y: 100, width: 200, height: 200)
        self.view.addSubview(view)
        
        let longPressRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(handleLongPress(_:)))
        view.addGestureRecognizer(longPressRecognizer)
    }
    
    @objc func handleLongPress(_ gestureRecognizer: UILongPressGestureRecognizer) {
        let location = gestureRecognizer.location(in: gestureRecognizer.view)
        
        switch gestureRecognizer.state {
        case .began:
            // タッチの開始
            print("長押し開始 at \(location)")
            gestureRecognizer.view?.backgroundColor = .green
        case .changed:
            // タッチ位置の移動
            print("長押し中の移動 at \(location)")
        case .ended:
            // タッチの終了
            print("長押し終了 at \(location)")
            gestureRecognizer.view?.backgroundColor = .red
        default:
            break
        }
    }
}

サンプルコードの説明

◾️行17: handleLongPressメソッドを定義し、ジェスチャーレコグナイザからの入力に応じて処理を実行します。
◾️行18: 長押しの位置を取得します。
◾️行20-34: ジェスチャーレコグナイザの状態を確認し、それぞれのケース(開始、変更、終了)で異なる処理を行います。
行21-24: 長押しが開始されたとき、位置をコンソールに出力し、ビューの背景色を緑に変更します。
行25-257 長押し中に指が移動したとき、新しい位置をコンソールに出力します。
行28-31: 長押しが終了したとき、位置をコンソールに出力し、ビューの背景色を赤に戻します。

まとめ

いかがでしたか?
この記事では、サンプルコードを通じて、長押しジェスチャーの追加方法と、検知した際の処理方法やカスタマイズ方法について解説しました。
この記事が皆様の開発ライフの一助になれれば光栄です。

ふくしま

この記事があなたのスキルアップに役立ったなら、次のキャリアステップを踏み出す絶好の機会かもしれません。エンジニアとしてのさらなる成長と挑戦を求めるなら、
未経験からIT・Webエンジニアを目指すなら【ユニゾンキャリア】
をオススメします!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次