質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1000閲覧

Swift mapKitのピンを1つだけ置きたい

ataru2222

総合スコア272

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2022/03/11 13:39

前提・実現したいこと

長押ししたときにピンが複数生成されてしまうので、他のポイントを削除しながら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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Satochaaan

2022/03/26 13:18

コードをコピーして実行してみましたが、1度の長押し時にピンが複数追加される挙動は確認できませんでした。 もしかして、 「長押しする度にピンが追加されるので、新しく長押しした際に他のピンが存在する場合削除したい」 という質問内容でしたでしょうか?
guest

回答1

0

ベストアンサー

下記のようにピンを追加する前に表示されているピンを削除するコードを追加すれば良さそうです。

swift

1 // 表示されているすべてのピンを削除 2 self.mapView.removeAnnotations(self.mapView.annotations) 3 4 // タップした位置情報に位置にピンを追加 5 pin.coordinate = coordinate 6 self.mapView.addAnnotation(pin)

投稿2022/03/26 13:25

Satochaaan

総合スコア31

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ataru2222

2022/03/26 16:59

解答していただきありがとうございました。 Annotationの値の入り方や削除方法が分からなかったので本当に助かりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問