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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

1回答

1487閲覧

CLLocationManagerDelegate,MKMapViewDelegateの併用

goyamaro

総合スコア14

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2019/11/15 04:54

質問について

地図アプリを作っている者です。
現在までに作成した地図アプリは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

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

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

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

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

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

guest

回答1

0

自己解決

MKMapviewのデリゲートメソッドである"viewfor"を削除したところ一応、これまで通り自分の位置を表示することができました。しかし、ピンの色を変更する処理ができていないので、これから調べていくなかでまた疑問があったら質問させていただきます。

投稿2019/11/15 06:38

goyamaro

総合スコア14

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問