前提・実現したいこと
高校生です。今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/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
高校生というのは、関係ないのでは?
それと、コードを下さいなどの質問は当サイトでは推奨されていません。
よって、コードの掲載は控えさせていただきます。
試した事や、参考にしたサイトのリンクなどを貼ることにより、回答を得られるのではないでしょうか?
回答1件
あなたの回答
tips
プレビュー