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

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

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

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

解決済

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

ataru2222
ataru2222

総合スコア210

Swift

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

1回答

0評価

0クリップ

336閲覧

投稿2022/03/11 13:39

前提・実現したいこと

長押ししたときにピンが複数生成されてしまうので、他のポイントを削除しながら1つのみ表示する仕様にしたい。

発生している問題・エラーメッセージ

こちらのサイトを参考にMapに長押しでピンを置く状態にしたのですが、長押しすればするほどどんどんピンが生成されてしまいまっております。

https://qiita.com/PictoMki/items/bbda6df26291e40e89b8

該当のソースコード(全体)

Swift

import UIKit // 2つimportする import MapKit import CoreLocation // MKMapViewDelegateを継承 class ViewController: UIViewController,CLLocationManagerDelegate,MKMapViewDelegate { // storyboardから接続する @IBOutlet weak var mapView: MKMapView! // locationManagerを宣言する var locationManager: CLLocationManager! override func viewDidLoad() { super.viewDidLoad() // ロケーションマネージャーのセットアップ locationManager = CLLocationManager() locationManager.delegate = self locationManager!.requestWhenInUseAuthorization() // 東京駅に照準を合わす let span = MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01) // 東京駅の位置情報をセット let tokyoStation = CLLocationCoordinate2DMake(35.681236, 139.767125) // centerに東京駅のlocationDataをセット let region = MKCoordinateRegion(center: tokyoStation, span: span) mapView.region = region // delegateをセット mapView.delegate = self // ロングタップを検知 let longPress = UILongPressGestureRecognizer(target: self, action: #selector(recognizeLongPress(sender:))) //MapViewにリスナーを登録 self.mapView.addGestureRecognizer(longPress) //航空写真 mapView.mapType = .hybrid //mapView.mapType = .standard //3Dビュー mapView.camera.pitch = 70 //俯角 mapView.camera.altitude = 700 //標高 } //許可を求めるためのdelegateメソッド func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { switch status { // 許可されてない場合 case .notDetermined: // 許可を求める manager.requestWhenInUseAuthorization() // 拒否されてる場合 case .restricted, .denied: // 何もしない break // 許可されている場合 case .authorizedAlways, .authorizedWhenInUse: // 現在地の取得を開始 manager.startUpdatingLocation() break default: break } } func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) { // タップされたピンの位置情報 print(view.annotation?.coordinate) // タップされたピンのタイトルとサブタイトル print(view.annotation?.title) print(view.annotation?.subtitle) } //ロングタップした時に呼ばれる関数 @objc func recognizeLongPress(sender: UILongPressGestureRecognizer) { //長押し感知は最初の1回のみ if sender.state != UIGestureRecognizer.State.began { return } // 位置情報を取得 let location = sender.location(in: self.mapView) let coordinate = self.mapView.convert(location, toCoordinateFrom: self.mapView) // 出力 print(coordinate.latitude) print(coordinate.longitude) // タップした位置に照準を合わせる処理 let span = MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01) let region = MKCoordinateRegion(center: coordinate, span: span) self.mapView.region = region // ピンを生成 let pin = MKPointAnnotation() pin.title = "タイトル" pin.subtitle = "サブタイトル" // タップした位置情報に位置にピンを追加 pin.coordinate = coordinate self.mapView.addAnnotation(pin) } }

該当コード

Swift

//ロングタップした時に呼ばれる関数 @objc func recognizeLongPress(sender: UILongPressGestureRecognizer) { //長押し感知は最初の1回のみ if sender.state != UIGestureRecognizer.State.began { return } // 位置情報を取得 let location = sender.location(in: self.mapView) let coordinate = self.mapView.convert(location, toCoordinateFrom: self.mapView) // 出力 print(coordinate.latitude) print(coordinate.longitude) // タップした位置に照準を合わせる処理 let span = MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01) let region = MKCoordinateRegion(center: coordinate, span: span) self.mapView.region = region // ピンを生成 let pin = MKPointAnnotation() pin.title = "タイトル" pin.subtitle = "サブタイトル" // タップした位置情報に位置にピンを追加 pin.coordinate = coordinate self.mapView.addAnnotation(pin) }

試したこと

調べたのですが、長押しで生成される座標情報等の格納されている形がわかリませんでした。
こちらについて詳しい方いらっしゃいましたらご教授ください。

よろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

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

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

Satochaaan

2022/03/26 13:18

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

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Swift

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