質問について
地図アプリを作っている者です。
現在までに作成した地図アプリはCLlocationManagerを使って現在位置を表示しています。
今回、ピンの装飾をmapViewのデリゲートメソッドであるviewforで行おうと思い、実装したところ自分の位置とピンが表示されなくなってしまいました。
今まで使っていたCLLocationManagerDelegateとMKMapviewDelegateを併用できるのであれば、実装したいです。
どなたかご存知の方、よろしくお願いします。
現在までに作成したCLLocaitonManagerを用いた地図アプリのコード
swift
1import UIKit 2import MapKit 3import CoreLocation 4 5class otameshi: UIViewController,CLLocationManagerDelegate{ 6 7 @IBOutlet var mapView : MKMapView! 8 var locManager : CLLocationManager! 9 10 //地図中心更新を一度だけ実行する 11 var centeronce : Bool = true 12 13 override func viewDidLoad() { 14 super.viewDidLoad() 15 16 locManager = CLLocationManager() 17 locManager.delegate = self 18 19 //位置情報の使用の許可を得る 20 locManager.requestWhenInUseAuthorization() 21 if CLLocationManager.locationServicesEnabled(){ 22 switch CLLocationManager.authorizationStatus(){ 23 //使用中と常に取得時に現在地の取得を始める 24 case .authorizedWhenInUse: 25 //座標の表示 26 locManager.startUpdatingLocation() 27 break 28 case .authorizedAlways: 29 locManager.startUpdatingLocation() 30 break 31 default: 32 break 33 } 34 } 35 36 //地図の初期化 37 initMap() 38 39 } 40 41 //ユーザの位置が変更されるたびに呼び出される 42 func locationManager(_ manager: CLLocationManager, didUpdateLocations locations:[CLLocation]) { 43 let userlon = locations.last?.coordinate.longitude 44 let userlat = locations.last?.coordinate.latitude 45 46 47 //ピンの配置 48 pinTest(mylat: userlat!, mylon: userlon!) 49 50 51 //アプリ起動時のみupdateCurrentposを実行する 52 if centeronce{ 53 updateCurrentPos(locations.last!.coordinate) 54 centeronce = false 55 } 56 } 57 58 //地図の初期化関数 59 func initMap(){ 60 //縮尺の設定 61 var region : MKCoordinateRegion = mapView.region 62 region.span.latitudeDelta = 0.02 63 region.span.longitudeDelta = 0.02 64 mapView.setRegion(region,animated:true) 65 66 // 現在位置表示の有効化 67 mapView.showsUserLocation = true 68 69 //位置精度を最大にする 70 locManager.desiredAccuracy=kCLLocationAccuracyBest 71 72 73 //マップが現在地を追従するようになるーしない 74 mapView.userTrackingMode = .none 75 76 } 77 78 //地図の中心位置を更新する関数 79 func updateCurrentPos(_ coordinate:CLLocationCoordinate2D) { 80 //縮尺、表示領域について 81 var region:MKCoordinateRegion = mapView.region 82 //位置情報の関数の引数coordinateを中央にする 83 region.center = coordinate 84 //setRegion・・現在表示されている領域を変更し、オブションで変更をアニメーション化する 85 mapView.setRegion(region,animated:true) 86 } 87 88 89 //ピン配置 90 func pinTest(mylat : CLLocationDegrees,mylon : CLLocationDegrees){ 91 //ピンを生成 92 let pin : MKPointAnnotation = MKPointAnnotation() 93 94 //ピンを削除してから描画する 95 self.mapView.removeAnnotation(pin) 96 97 //ピンを配置する経度・緯度 98 var pinlat : CLLocationDegrees! 99 var pinlon : CLLocationDegrees! 100 101 //自分の位置を基準にピンの位置を算出 102 pinlat = mylat + 0.01 103 pinlon = mylon + 0.01 104 105 //ピンを配置する座標を作成・決定 106 let pinlocate : CLLocationCoordinate2D = CLLocationCoordinate2DMake(pinlat, pinlon) 107 pin.coordinate = pinlocate 108 109 pin.title = "テスト" 110 pin.subtitle = "装飾したいピン" 111 112 //マップに設置 113 mapView.addAnnotation(pin) 114 } 115} 116 117 118
MKMapViewDelegateを追加したコード
mapViewデリゲートメソッドの"didadd"は実行されていました。
"viewfor"も同様に実行されていましたが、ピンは表示されていませんでした。
swift
1 2 3import UIKit 4import MapKit 5import CoreLocation 6 7class otameshi: UIViewController,CLLocationManagerDelegate,MKMapViewDelegate { 8 9 @IBOutlet var mapView : MKMapView! 10 var locManager : CLLocationManager! 11 12 //地図中心更新を一度だけ実行する 13 var centeronce : Bool = true 14 15 16 override func viewDidLoad() { 17 super.viewDidLoad() 18 19 locManager = CLLocationManager() 20 locManager.delegate = self 21 22 mapView.delegate = self 23 24 //位置情報の使用の許可を得る 25 locManager.requestWhenInUseAuthorization() 26 if CLLocationManager.locationServicesEnabled(){ 27 switch CLLocationManager.authorizationStatus(){ 28 //使用中と常に取得時に現在地の取得を始める 29 case .authorizedWhenInUse: 30 //座標の表示 31 locManager.startUpdatingLocation() 32 break 33 case .authorizedAlways: 34 locManager.startUpdatingLocation() 35 break 36 default: 37 break 38 } 39 } 40 41 //地図の初期化 42 initMap() 43 44 } 45 46 //ユーザの位置が変更されるたびに呼び出される 47 func locationManager(_ manager: CLLocationManager, didUpdateLocations locations:[CLLocation]) { 48 let userlon = locations.last?.coordinate.longitude 49 let userlat = locations.last?.coordinate.latitude 50 51 52 //ピンの配置 53 pinTest(mylat: userlat!, mylon: userlon!) 54 55 56 //アプリ起動時のみupdateCurrentposを実行する 57 if centeronce{ 58 updateCurrentPos(locations.last!.coordinate) 59 centeronce = false 60 } 61 } 62 63 //地図の初期化関数 64 func initMap(){ 65 //縮尺の設定 66 var region : MKCoordinateRegion = mapView.region 67 region.span.latitudeDelta = 0.02 68 region.span.longitudeDelta = 0.02 69 mapView.setRegion(region,animated:true) 70 71 // 現在位置表示の有効化 72 mapView.showsUserLocation = true 73 74 //位置精度を最大にする 75 locManager.desiredAccuracy=kCLLocationAccuracyBest 76 77 78 //マップが現在地を追従するようになるーしない 79 mapView.userTrackingMode = .none 80 81 } 82 83 //地図の中心位置を更新する関数 84 func updateCurrentPos(_ coordinate:CLLocationCoordinate2D) { 85 //縮尺、表示領域について 86 var region:MKCoordinateRegion = mapView.region 87 //位置情報の関数の引数coordinateを中央にする 88 region.center = coordinate 89 //setRegion・・現在表示されている領域を変更し、オブションで変更をアニメーション化する 90 mapView.setRegion(region,animated:true) 91 } 92 93 94 //ピン配置 95 func pinTest(mylat : CLLocationDegrees,mylon : CLLocationDegrees){ 96 //ピンを生成 97 let pin : MKPointAnnotation = MKPointAnnotation() 98 99 //ピンを削除してから描画する 100 self.mapView.removeAnnotation(pin) 101 102 //ピンを配置する経度・緯度 103 var pinlat : CLLocationDegrees! 104 var pinlon : CLLocationDegrees! 105 106 //自分の位置を基準にピンの位置を算出 107 pinlat = mylat + 0.01 108 pinlon = mylon + 0.01 109 110 //ピンを配置する座標を作成・決定 111 let pinlocate : CLLocationCoordinate2D = CLLocationCoordinate2DMake(pinlat, pinlon) 112 pin.coordinate = pinlocate 113 114 pin.title = "テスト" 115 pin.subtitle = "装飾したいピン" 116 117 //マップに設置 118 mapView.addAnnotation(pin) 119 } 120 121 122 123 //addAnnotationされたときに呼ばれるデリゲートメソッド 124 func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { 125 126 print("ピンの装飾") 127 128 let identifier = "pin" 129 var annotationView: MKAnnotationView! 130 131 if annotationView == nil { 132 annotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: identifier) 133 } 134 135 // pinに表示する画像を指定 136 annotationView.tintColor = UIColor.blue 137 annotationView.annotation = annotation 138 annotationView.canShowCallout = true 139 140 return annotationView 141 142 } 143 144 //ピンが追加されたら通知するデリゲートメソッド 145 func mapView(_ mapView: MKMapView, 146 didAdd views: [MKAnnotationView]){ 147 print("表示されているピンの個数:(views.count)") 148 } 149 150 151} 152 153 154
補足情報(FW/ツールのバージョンなど)
Xcode 11.2
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。