Help us understand the problem. What is going on with this article?

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

記事一覧

Swift MkMapViewで地図アプリ作成してみた(記事一覧)

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

  1. storyboardにUILongPressGestureRecognizerを貼り付ける。

    「command + shift + l(エル)」でObjects Libraryを表示する。
    Long Press Gesture Recognizerをstoryboard上のデバイスまでドラックしてドロップする。
    longPress1.png

    貼り付けた結果以下の様になる。
    longPress2.png

  2. ViewController.swiftにUILongPressGestureRecognizerの変数を定義する。

    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までドラックしてドロップする。
    longPressGesRec1.png

    紐付ける変数(longPressGesRec)を選択する。
    longPressGesRec2.png

  4. UILongPressGestureRecognizerのdelegateを登録する

    UIGestureRecognizerDelegateを継承する。

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

    ロングタップした時にCallされる関数を実装する。
    関数名は任意で良いが、引数はUILongPressGestureRecognizerを指定する。

    ViewController.swift:ロングタップを検出する
        // UILongPressGestureRecognizerのdelegate:ロングタップを検出する
        @IBAction func mapViewDidLongPress(_ sender: UILongPressGestureRecognizer) {
            // ロングタップ開始
            if sender.state == .began {
            }
            // ロングタップ終了(手を離した)
            else if sender.state == .ended {
            }
    

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

    Action.png

    ▶︎を押してPCシミュレータを起動して、検出できることを確認する。
    LongTapRun.png

タップした位置の緯度経度を取得する

  1. タップした位置(CGPoint)を指定してMkMapView上の緯度経度を取得する

    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で地図アプリ作成してみた(記事一覧)

yuta-sasaki
車載ソフトウェア開発者です。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away