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

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

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

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

Q&A

解決済

1回答

3219閲覧

Swift マップのピンに吹き出しが出ません

unchi

総合スコア12

Swift

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

0グッド

0クリップ

投稿2019/09/13 17:06

前提・実現したいこと

高校生です。今Swifftで自力でマップ関連のアプリを作っています。実現したいこととしましては、マップのピンをタップすることで、吹き出しを出して、その中にボタンをつけることです。現状としては、ピンを立てるところまではできたのですが、吹き出しが出て来ず、困っています。見よう見まねでいろんなサイトから引っ張ってきものです。

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

エラーメッセージはないです

該当のソースコード

Swift

1import UIKit 2import MapKit 3import CoreLocation 4 5class ViewController: UIViewController,CLLocationManagerDelegate,UIGestureRecognizerDelegate,MKMapViewDelegate{ 6 7 var locManager: CLLocationManager! 8 var pointAno: MKPointAnnotation = MKPointAnnotation() 9 var button: UIButton! 10 11 @IBOutlet var mapView: MKMapView! 12 @IBOutlet var longPressGesRec: UILongPressGestureRecognizer! 13 @IBOutlet var tapgesture: UITapGestureRecognizer! 14 15 override func viewDidLoad() { 16 super.viewDidLoad() 17 18 // Do any additional setup after loading the view. 19 locManager = CLLocationManager() 20 locManager.delegate = self 21 22 // 位置情報の使用の許可を得る 23 locManager.requestWhenInUseAuthorization() 24 if CLLocationManager.locationServicesEnabled() { 25 switch CLLocationManager.authorizationStatus() { 26 case .authorizedWhenInUse: 27 // 座標の表示 28 locManager.startUpdatingLocation() 29 break 30 default: 31 break 32 } 33 } 34 35 // 地図の初期化 36 initMap() 37 38 } 39 40 /* @IBAction func mapViewDidPress(_ sender: UITapGestureRecognizer) { 41 //タップ開始 42 if sender.state == .began { 43 } 44 // タップ終了(手を離した) 45 else if sender.state == .ended { 46 print("押した") 47 } 48 49 } 50 */ 51 52 @IBAction func tagmemo(_ sender: UILongPressGestureRecognizer) { 53 // タップ開始 54 if sender.state == .began { 55 // タップ開始時に古いピンを削除する 56 mapView.removeAnnotation(pointAno) 57 } 58 // タップ終了(手を離した) 59 else if sender.state == .ended { 60 // タップした位置(CGPoint)を指定してMkMapView上の緯度経度を取得する 61 let tapPoint = sender.location(in: view) 62 let center = mapView.convert(tapPoint, toCoordinateFrom: mapView) 63 64 let lonStr = center.longitude.description 65 let latStr = center.latitude.description 66 print("lon : " + lonStr) 67 print("lat : " + latStr) 68 69 // 現在位置とタップした位置の距離(m)を算出する 70 let distance = calcDistance(mapView.userLocation.coordinate, center) 71 print("distance : " + distance.description) 72 73 if (0 != distance) { 74 // ピンに設定する文字列を生成する 75 var str:String = Int(distance).description 76 str = str + " m" 77 78 79 if pointAno.title != str { 80 // ピンまでの距離に変化があればtitleを更新する 81 pointAno.title = str 82 pointAno.subtitle = "サブタイトル(ピンをタップすると表示される)" 83 } 84 } 85 86 //ロングタップを検出した位置にピンを立てる 87 pointAno.coordinate=center 88 mapView.addAnnotation(pointAno) 89 } 90 } 91 92 func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { 93 94 let myPinIdentifier = "PinAnnotationIdentifier" 95 96 // ピンを生成. 97 let myPinView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: myPinIdentifier) 98 99 // アニメーションをつける. 100 myPinView.animatesDrop = true 101 102 // コールアウトを表示する. 103 myPinView.canShowCallout = true 104 105 // annotationを設定. 106 myPinView.annotation = annotation 107 108 return myPinView 109 } 110 111 //ViewController.swift:現在位置更新を受信する 112 func locationManager(_ manager: CLLocationManager, didUpdateLocations locations:[CLLocation]) { 113 updateCurrentPos((locations.last?.coordinate)!) 114 mapView.userTrackingMode = .follow 115 let lonStr = (locations.last?.coordinate.longitude.description)! 116 let latStr = (locations.last?.coordinate.latitude.description)! 117 118 print("lonnow : " + lonStr) 119 print("latnow : " + latStr) 120 } 121 122 //地図の初期化関数 123 func initMap() { 124 // 縮尺を設定 125 var region:MKCoordinateRegion = mapView.region 126 region.span.latitudeDelta = 0.02 127 region.span.longitudeDelta = 0.02 128 mapView.setRegion(region,animated:true) 129 130 // 現在位置表示の有効化 131 mapView.showsUserLocation = true 132 // 現在位置設定(デバイスの動きとしてこの時の一回だけ中心位置が現在位置で更新される) 133 mapView.userTrackingMode = .followWithHeading 134 } 135 136 //地図の中心位置の更新関数 137 func updateCurrentPos(_ coordinate:CLLocationCoordinate2D) { 138 var region:MKCoordinateRegion = mapView.region 139 region.center = coordinate 140 mapView.setRegion(region,animated:true) 141 } 142 143 //二点間距離の計算 144 func calcDistance(_ a: CLLocationCoordinate2D, _ b: CLLocationCoordinate2D) -> CLLocationDistance { 145 // CLLocationオブジェクトを生成 146 let aLoc: CLLocation = CLLocation(latitude: a.latitude, longitude: a.longitude) 147 let bLoc: CLLocation = CLLocation(latitude: b.latitude, longitude: b.longitude) 148 // CLLocationオブジェクトのdistanceで2点間の距離(m)を算出 149 let dist = bLoc.distance(from: aLoc) 150 return dist 151 } 152}

試したこと

ここに問題に対して試したことを記載してください。

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

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

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/09/13 17:28

高校生というのは、関係ないのでは? それと、コードを下さいなどの質問は当サイトでは推奨されていません。 よって、コードの掲載は控えさせていただきます。 試した事や、参考にしたサイトのリンクなどを貼ることにより、回答を得られるのではないでしょうか?
guest

回答1

0

ベストアンサー

調べていたら、同じようなことがQiitaで記事にされています。
https://qiita.com/koogawa/items/b5d610c23d92ca4fd84e

自分もコードを見て、気になったのですが、
下記がないからではないでしょうか?

Swift

1mapView.delegate = self

投稿2019/09/17 04:08

hameji

総合スコア1380

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問