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

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

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

解決済

SwiftUIでの現在位置情報の取得

akaboshi
akaboshi

総合スコア5

2回答

0評価

0クリップ

275閲覧

投稿2022/05/05 09:41

SwiftUIにてContentViewとは、別のView(MapView)で現在位置を地図と情報として表示したいと考えています。
位置情報をprintで表示しているのですが、情報が”0”となってしまい読み取れません。

MKCoordinateRegion(center: __C.CLLocationCoordinate2D(latitude: 0.0, longitude: 0.0), span: __C.MKCoordinateSpan(latitudeDelta: 0.0, longitudeDelta: 0.0))

アドバイスいただけると助かります。

SwiftUI

MapLocationSearchApp.swift import SwiftUI @main struct MapLocationSearchApp: App { var body: some Scene { WindowGroup { ContentView() .environmentObject(LocationManager()) } } }

SwiftUI

ContentView.swift import SwiftUI import MapKit struct ContentView: View { var body: some View { MapView() .environmentObject(LocationManager()) } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }

地図表示の初期の中心を現在位置と別の位置を指定して、userLocationを表示して地図上で差異を確認出来るようにしています。

SwiftUI

MapView.swift import SwiftUI import MapKit struct MapView: UIViewRepresentable { @EnvironmentObject var locationManager: LocationManager @State var trackingMode = MapUserTrackingMode.follow let map = MKMapView() func makeUIView(context: Context) -> MKMapView { // Tokyo 35.6804° N, 139.7690° E // Tokyo Station 35.681236° N, 139.767125° E let initCenter = CLLocationCoordinate2D(latitude: 35.681236, longitude: 139.767125) let initRegion = MKCoordinateRegion(center: initCenter, latitudinalMeters: 10000, longitudinalMeters: 10000) print("初期値:\(initRegion)") map.region = initRegion map.showsUserLocation = true return map } func updateUIView(_ uiView: MKMapView, context: Context) { print("更新後:\(locationManager.region)") print("UserTrackingMode:\(trackingMode)") // uiView.region = locationManager.region //画面が青くなるので、コメントアウト } } struct MapView_Previews: PreviewProvider { static var previews: some View { MapView(trackingMode: MapUserTrackingMode.none) .environmentObject(LocationManager()) } }

SwiftUI

import SwiftUI import MapKit //現在地を取得するクラス class LocationManager: NSObject, ObservableObject, CLLocationManagerDelegate { //ロケーションマネージャを作る let manager = CLLocationManager() //領域の更新をパブリッシュする @Published var region = MKCoordinateRegion() override init() { super.init() //スーパークラスのイニシャライザ実行 manager.delegate = self //デリゲートの設定 manager.requestWhenInUseAuthorization() //プライバシー設定の確認 manager.desiredAccuracy = kCLLocationAccuracyBest manager.distanceFilter = 2 //更新距離(m) manager.startUpdatingHeading() //追従の開始 } //領域の更新 func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { //locationsの最後の要素に対して実行 locations.last.map { let center = CLLocationCoordinate2D( latitude: $0.coordinate.latitude, longitude: $0.coordinate.longitude) print("coordinate: \($0.coordinate.latitude)\($0.coordinate.longitude)") //領域の更新 region = MKCoordinateRegion( center: center, latitudinalMeters: 1000.0, longitudinalMeters: 1000.0) } } }

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る