Swift MkMapViewで地図アプリ作成してみた（08）- ロングタップした位置の緯度経度を取得する

#記事一覧
[Swift MkMapViewで地図アプリ作成してみた（記事一覧）](https://qiita.com/rain_00_00_09/items/3151b3faf2303fe78312)

#UILongPressGestureRecognizerでロングタップを検出する

1. storyboardにUILongPressGestureRecognizerを貼り付ける。
    
    「command + shift + l（エル）」でObjects Libraryを表示する。
    Long Press Gesture Recognizerをstoryboard上のデバイスまでドラックしてドロップする。
    <img width="744" alt="longPress1.png" src="https://qiita-image-store.s3.amazonaws.com/0/362635/ada604ed-7e74-87b0-b0ab-78ee6dfeba35.png">
    
    貼り付けた結果以下の様になる。
    <img width="750" alt="longPress2.png" src="https://qiita-image-store.s3.amazonaws.com/0/362635/342b9b09-641d-900b-dc4c-8863f6eef466.png">

2. ViewController.swiftにUILongPressGestureRecognizerの変数を定義する。
    
    ```swift:ViewController.swift：UILongPressGestureRecognizerの変数を定義
        class ViewController:   UIViewController,
                                CLLocationManagerDelegate {
    
            @IBOutlet var mapView: MKMapView!
            var locManager: CLLocationManager!
            @IBOutlet var longPressGesRec: UILongPressGestureRecognizer!
    ```

3. UILongPressGestureRecognizer変数にUI Objectを紐付ける。

    Long Press Gesture Recognizerで右クリックし、Referencing Outletsの○をView Controllerまでドラックしてドロップする。
    <img width="750" alt="longPressGesRec1.png" src="https://qiita-image-store.s3.amazonaws.com/0/362635/05c3b34b-2e2c-1d19-b940-52c1a8a7965b.png">

    紐付ける変数（longPressGesRec）を選択する。
    <img width="750" alt="longPressGesRec2.png" src="https://qiita-image-store.s3.amazonaws.com/0/362635/aecf0279-b967-6e87-ee63-5436ad846242.png">

4. UILongPressGestureRecognizerのdelegateを登録する
    
    UIGestureRecognizerDelegateを継承する。

    ```swift:ViewController.swift：UIGestureRecognizerDelegateを継承する
        class ViewController:   UIViewController,
                                CLLocationManagerDelegate,
                                UIGestureRecognizerDelegate {
    ```

    ロングタップした時にCallされる関数を実装する。
    関数名は任意で良いが、引数はUILongPressGestureRecognizerを指定する。
    
    ```swift:ViewController.swift：ロングタップを検出する
        // UILongPressGestureRecognizerのdelegate：ロングタップを検出する
        @IBAction func mapViewDidLongPress(_ sender: UILongPressGestureRecognizer) {
            // ロングタップ開始
            if sender.state == .began {
            }
            // ロングタップ終了（手を離した）
            else if sender.state == .ended {
            }
    ```

    定義した関数に、UI ObjectのSent Actionsを紐付ける。

    <img width="750" alt="Action.png" src="https://qiita-image-store.s3.amazonaws.com/0/362635/b62c2fb8-b545-187c-bf3f-025197a78641.png">

    ▶︎を押してPCシミュレータを起動して、検出できることを確認する。
    <img width="750" alt="LongTapRun.png" src="https://qiita-image-store.s3.amazonaws.com/0/362635/97a56524-e7a8-8b03-95dc-0081f023302c.png">

#タップした位置の緯度経度を取得する
1. タップした位置（CGPoint）を指定してMkMapView上の緯度経度を取得する
    
    ```swift:ViewController.swift：タップした位置（CGPoint）を指定してMkMapView上の緯度経度を取得する
        // UILongPressGestureRecognizerのdelegate：ロングタップを検出する
        @IBAction func mapViewDidLongPress(_ sender: UILongPressGestureRecognizer) {
            // ロングタップ開始
            if sender.state == .began {
            }
            // ロングタップ終了（手を離した）
            else if sender.state == .ended {
                // タップした位置（CGPoint）を指定してMkMapView上の緯度経度を取得する
                let tapPoint = sender.location(in: view)
                let center = mapView.convert(tapPoint, toCoordinateFrom: mapView)
 
                let lonStr = center.longitude.description
                let latStr = center.latitude.description
                print("lon : " + lonStr)
                print("lat : " + latStr)
            }
    ```

#記事一覧
[Swift MkMapViewで地図アプリ作成してみた（記事一覧）](https://qiita.com/rain_00_00_09/items/3151b3faf2303fe78312)