Как сосредоточиться на местоположении пользователя с помощью SwiftUI и GoogleMaps iOS SDK - PullRequest
0 голосов
/ 09 октября 2019

Я все еще новичок в Xcode и SwiftUI, поэтому я приношу свои извинения, если это просто для некоторых людей. По сути, я делаю приложение, которое использует GoogleMaps iOS SDK, и я пытаюсь выяснить, как сфокусировать камеру карты на текущем местоположении пользователя при запуске.

Сейчас мой код работает так, что у меня естьосновной вид, который вызывает представление GoogleMaps и несколько других представлений. Карта инициализируется, и камера фокусируется на заданном мною местоположении (Бостон), сбрасывает булавку в определенном месте (Бостон), отображает мое текущее местоположение с синей точкой, а камера фокусируется на моем текущем местоположении ТОЛЬКО ПОСЛЕНажата кнопка myLocation (которая присуща Google Maps).

Мой основной вид, который вызывает мой вид карт Google, находится здесь:


import SwiftUI

struct LandmarkList: View {

    @State private var searchText = ""
    @State private var locationText = ""

    var body: some View {

        NavigationView {

            GoogMapView()
                .frame(height: 750)
        }
        .edgesIgnoringSafeArea(.vertical)
        .navigationBarItems(leading:

        TextField("Current Location",text: self.$locationText)
        .textFieldStyle(RoundedBorderTextFieldStyle())
        .multilineTextAlignment(.leading)
        .frame(width: 375)
            )

        }

Мой вид карт Google (я называю его GoogMapView): ОБНОВЛЕНО НА ОСНОВЕ КОММЕНТАРИЙ И ОБУЧЕНИЯ НИЖЕ:

import SwiftUI
//import MapKit
import UIKit
import GoogleMaps
import GooglePlaces


private let locationManager = CLLocationManager()

struct GoogMapView : UIViewRepresentable {

        let marker : GMSMarker = GMSMarker()

        //Creates a `UIView` instance to be presented.
        func makeUIView(context: Self.Context) -> GMSMapView {
            // Create a GMSCameraPosition
            let camera = GMSCameraPosition.camera(withLatitude: 42.361145, longitude: -71.057083, zoom: 16.0)
            let mapView = GMSMapView.map(withFrame: CGRect.zero, camera: camera)
            mapView.setMinZoom(14, maxZoom: 20)
            mapView.settings.compassButton = true
            mapView.isMyLocationEnabled = true
            mapView.settings.myLocationButton = true
            mapView.settings.scrollGestures = true
            mapView.settings.zoomGestures = true
            mapView.settings.rotateGestures = true
            mapView.settings.tiltGestures = true
            mapView.isIndoorEnabled = false

            if let mylocation = mapView.myLocation {
              print("User's location: \(mylocation)")
            } else {
              print("User's location is unknown")
            }
            locationManager.delegate = self
            locationManager.requestWhenInUseAuthorization()

            return mapView
        }

//        Updates the presented `UIView` (and coordinator) to the latestconfiguration.
        func updateUIView(_ mapView: GMSMapView, context: Self.Context) {
            // Creates a marker in the center of the map.
            marker.position = CLLocationCoordinate2D(latitude: 42.361145, longitude: -71.057083)
            marker.title = "Boston"
            marker.snippet = "USA"
            marker.map = mapView
        }
}

Я думал, что смогу взять mapView.myLocation и использовать его для ручной фокусировки камеры на карте при запуске, но это не сработало. Вы можете увидеть в приведенном выше коде, я пытаюсь распечатать местоположение, но все, что я получаю, это «Местоположение пользователя неизвестно». Кроме того, теперь появляется ошибка «Невозможно присвоить значение типа« GoogMapView »для типа« CLLocationManagerDelegate? »,« Где я печатаю »locationManager.delegate = self».

Кто-нибудь имеет представление о «правильном» способечтобы камера фокусировалась на текущем местоположении пользователя при запуске?

1 Ответ

1 голос
/ 10 октября 2019

Я думал, что смогу взять mapView.myLocation и использовать его для ручной фокусировки камеры при запуске, но это не сработало. Вы можете видеть в приведенном выше коде, я пытаюсь распечатать местоположение, но все, что я получаю обратно, это 'Местоположение пользователя неизвестно'

Похоже, mylocation не содержит никакого местоположениякоординаты. mapView.myLocation может отличаться от того, что вы думаете, возможно, оно содержит местоположение устройства пользователя, а не координату, которую вы передаете в GMSCameraPosition . Согласно документации

Если Мое местоположение включено, отображается , где рисуется точка пользователя .

Так что это не то, что выпереходите к камере

Кто-нибудь имеет представление о "правильном" способе фокусировки камеры карты на текущем местоположении пользователя при запуске?

Естьвы где-то создали locationManager и имели дело с разрешениями на местоположение? Если у вас есть, вы можете поймать местоположение пользователя внутри функции didUpdateLocations - для получения местоположения пользователя при запуске требуется около двух секунд. Как только вы получите местоположение, вы можете выполнить панорамирование камеры в этом месте.

...