🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Xcode

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

Swift

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

Q&A

解決済

1回答

1961閲覧

Swift Mapkitを用いた現在地の取得

prgramen

総合スコア19

Xcode

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

Swift

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

0グッド

1クリップ

投稿2020/12/17 09:00

前提・実現したいこと

【実現したいこと】
Swiftにて、下記のサイトに従ってマップアプリを作成しています。
【Swift5】 Mapkitまとめ - Quiita
アプリ起動時、現在地を取得して初期の標準位置に設定したいです。

【前提】
・画面いっぱいにMapViewを貼り付けています。
・MapkitとCoreLocationを使用しています。
・Info.plistに以下の項目を設定しています。
Privacy - Location Always Usage Description
Privacy - Location When In Use Usage Description

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

現在地を正しく取得できていません。 printでmapView.userLocation.coordinateを出力してみると以下のとおりです。 CLLocationCoordinate2D(latitude: 0.0, longitude: 0.0)

該当のソースコード

Swift

1 2import UIKit 3import MapKit 4import CoreLocation 5 6class ViewController: UIViewController, CLLocationManagerDelegate { 7 8 @IBOutlet weak var mapView: MKMapView! 9 var locationManager: CLLocationManager! 10 11 override func viewDidLoad() { 12 super.viewDidLoad() 13 14 // ロケーションマネージャーのセットアップ 15 locationManager = CLLocationManager() // ロケーションマネージャのインスタンス 16 locationManager.delegate = self // デリゲートを指定 17 locationManager!.requestWhenInUseAuthorization() // 位置情報許可のリクエスト 18 19 // ここで現在地を出力 20 print("mapView.userLocation.coordinate:(mapView.userLocation.coordinate)") 21 // 現在地に照準を合わす 22 // 0.01が距離の倍率 23 let span = MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01) 24 25 // 現在地の取得 26 let region = MKCoordinateRegion(center: mapView.userLocation.coordinate, span: span) 27 // ここで照準を合わせている 28 mapView.region = region 29 } 30 31 // 許可を求めるためのdelegateメソッド 32 func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { 33 switch status { 34 35 // 許可の選択をされていない場合 36 case .notDetermined: 37 print("位置情報の取得許可を選択されていません") 38 locationManager!.requestWhenInUseAuthorization() // 許可を求める 39 // 位置情報サービスが使用できない場合 40 case .restricted: 41 print("位置情報サービスが使用できません") 42 break // 何もしない 43 // 拒否された場合 44 case .denied: 45 print("位置情報の取得が拒否されました") 46 break 47 // 常時、またはアプリの使用中のみ許可されている場合 48 case .authorizedAlways, .authorizedWhenInUse: 49 print("位置情報の取得が許可されています") 50 manager.startUpdatingLocation() // 現在地の取得を開始 51 break 52 default: 53 break 54 } 55 } 56} 57 58

試したこと

printにて現在地を出力

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

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

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

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

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

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

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

guest

回答1

0

自己解決

標準を合わせるタイミングの問題でした。
問題のプログラム中では、DidViewLoadで標準を合わせていました。

Swift

1 override func viewDidLoad() { 2 super.viewDidLoad() 3 4 // ロケーションマネージャーのセットアップ 5 locationManager = CLLocationManager() // ロケーションマネージャのインスタンス 6 locationManager.delegate = self // デリゲートを指定 7 locationManager!.requestWhenInUseAuthorization() // 位置情報許可のリクエスト 8 9 // ここで現在地を出力 10 print("mapView.userLocation.coordinate:(mapView.userLocation.coordinate)") 11 // 現在地に照準を合わす 12 // 0.01が距離の倍率 13 let span = MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01) 14 15 // 現在地の取得 16 let region = MKCoordinateRegion(center: mapView.userLocation.coordinate, span: span) 17 // ここで照準を合わせている~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 18 mapView.region = region 19 }

しかし、それではロケーションが更新されていなく、
print("mapView.userLocation.coordinate:(mapView.userLocation.coordinate)")
を出力しても、初期値の0,0でした。

ここで、ロケーションが更新されたあとのデリゲートメソッドを追加します。

Swift

1 func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 2 3 // 現在地に照準を合わす 4 // 0.01が距離の倍率 5 let span = MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01) 6 7 // 現在地の取得 8 let region = MKCoordinateRegion(center: mapView.userLocation.coordinate, span: span) 9 // ここで照準を合わせている 10 mapView.region = region 11 }

するとなんと言うことでしょう!
見事に標準があっているではありませんか!
もしあなたが、この同じ問題で悩んでいるならば、
これはあなたにとって役に立つことでしょう:)

投稿2020/12/18 03:00

prgramen

総合スコア19

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問