前提・実現したいこと
長押ししたときにピンが複数生成されてしまうので、他のポイントを削除しながら1つのみ表示する仕様にしたい。
発生している問題・エラーメッセージ
こちらのサイトを参考にMapに長押しでピンを置く状態にしたのですが、長押しすればするほどどんどんピンが生成されてしまいまっております。
https://qiita.com/PictoMki/items/bbda6df26291e40e89b8
該当のソースコード(全体)
Swift
1import UIKit 2// 2つimportする 3import MapKit 4import CoreLocation 5 6// MKMapViewDelegateを継承 7class ViewController: UIViewController,CLLocationManagerDelegate,MKMapViewDelegate { 8 // storyboardから接続する 9 @IBOutlet weak var mapView: MKMapView! 10 // locationManagerを宣言する 11 var locationManager: CLLocationManager! 12 13 override func viewDidLoad() { 14 super.viewDidLoad() 15 // ロケーションマネージャーのセットアップ 16 locationManager = CLLocationManager() 17 locationManager.delegate = self 18 locationManager!.requestWhenInUseAuthorization() 19 20 // 東京駅に照準を合わす 21 let span = MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01) 22 // 東京駅の位置情報をセット 23 let tokyoStation = CLLocationCoordinate2DMake(35.681236, 139.767125) 24 // centerに東京駅のlocationDataをセット 25 let region = MKCoordinateRegion(center: tokyoStation, span: span) 26 mapView.region = region 27 28 // delegateをセット 29 mapView.delegate = self 30 31 // ロングタップを検知 32 let longPress = UILongPressGestureRecognizer(target: self, action: #selector(recognizeLongPress(sender:))) 33 //MapViewにリスナーを登録 34 self.mapView.addGestureRecognizer(longPress) 35 36 //航空写真 37 mapView.mapType = .hybrid 38 39 //mapView.mapType = .standard 40 //3Dビュー 41 mapView.camera.pitch = 70 //俯角 42 mapView.camera.altitude = 700 //標高 43 44 45 } 46 47 //許可を求めるためのdelegateメソッド 48 func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { 49 switch status { 50 // 許可されてない場合 51 case .notDetermined: 52 // 許可を求める 53 manager.requestWhenInUseAuthorization() 54 // 拒否されてる場合 55 case .restricted, .denied: 56 // 何もしない 57 break 58 // 許可されている場合 59 case .authorizedAlways, .authorizedWhenInUse: 60 // 現在地の取得を開始 61 manager.startUpdatingLocation() 62 break 63 default: 64 break 65 } 66 } 67 68 func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) { 69 // タップされたピンの位置情報 70 print(view.annotation?.coordinate) 71 // タップされたピンのタイトルとサブタイトル 72 print(view.annotation?.title) 73 print(view.annotation?.subtitle) 74 } 75 76 //ロングタップした時に呼ばれる関数 77 @objc func recognizeLongPress(sender: UILongPressGestureRecognizer) { 78 //長押し感知は最初の1回のみ 79 if sender.state != UIGestureRecognizer.State.began { 80 return 81 } 82 83 // 位置情報を取得 84 let location = sender.location(in: self.mapView) 85 let coordinate = self.mapView.convert(location, toCoordinateFrom: self.mapView) 86 // 出力 87 print(coordinate.latitude) 88 print(coordinate.longitude) 89 // タップした位置に照準を合わせる処理 90 let span = MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01) 91 let region = MKCoordinateRegion(center: coordinate, span: span) 92 self.mapView.region = region 93 94 // ピンを生成 95 let pin = MKPointAnnotation() 96 pin.title = "タイトル" 97 pin.subtitle = "サブタイトル" 98 // タップした位置情報に位置にピンを追加 99 pin.coordinate = coordinate 100 self.mapView.addAnnotation(pin) 101 } 102} 103
該当コード
Swift
1//ロングタップした時に呼ばれる関数 2 @objc func recognizeLongPress(sender: UILongPressGestureRecognizer) { 3 //長押し感知は最初の1回のみ 4 if sender.state != UIGestureRecognizer.State.began { 5 return 6 } 7 8 // 位置情報を取得 9 let location = sender.location(in: self.mapView) 10 let coordinate = self.mapView.convert(location, toCoordinateFrom: self.mapView) 11 // 出力 12 print(coordinate.latitude) 13 print(coordinate.longitude) 14 // タップした位置に照準を合わせる処理 15 let span = MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01) 16 let region = MKCoordinateRegion(center: coordinate, span: span) 17 self.mapView.region = region 18 19 // ピンを生成 20 let pin = MKPointAnnotation() 21 pin.title = "タイトル" 22 pin.subtitle = "サブタイトル" 23 // タップした位置情報に位置にピンを追加 24 pin.coordinate = coordinate 25 self.mapView.addAnnotation(pin) 26 }
試したこと
調べたのですが、長押しで生成される座標情報等の格納されている形がわかリませんでした。
こちらについて詳しい方いらっしゃいましたらご教授ください。
よろしくお願いいたします。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
コードをコピーして実行してみましたが、1度の長押し時にピンが複数追加される挙動は確認できませんでした。
もしかして、
「長押しする度にピンが追加されるので、新しく長押しした際に他のピンが存在する場合削除したい」
という質問内容でしたでしょうか?
回答1件
あなたの回答
tips
プレビュー