Есть ли способ открыть InfoWindow при загрузке приложения в Google Maps API? - PullRequest
0 голосов
/ 27 февраля 2020

В настоящее время мое приложение открывает пользовательское информационное окно, когда делегат MapView вызывает протокол didTap. Затем вызывается функция, которая инициализирует необходимые аспекты информационного окна, показанного ниже ...

var tappedOverlay : GMSOverlay?
var customInfoWindow : CustomInfoWindow?
var mapView: GMSMapView!

override func viewDidLoad(){
        super.viewDidLoad()

        self.customInfoWindow = CustomInfoWindow().loadView()

        let camera = GMSCameraPosition.camera(withLatitude: 37, longitude: -77, zoom: 16.0)
        mapView = GMSMapView.map(withFrame: CGRect.zero, camera: camera)
        mapView.delegate = self
        self.view = mapView

        //this is where i attempt to force a infoWindow to open
        tappedOverlay = overlay
        initInfoWindow(overlay: overlay)
}

fun initInfoWindow(overlay: GMSOverlay){

        mapView.animate(toLocation: position!)
        let point = mapView.projection.point(for: position!)
        let newPoint = mapView.projection.coordinate(for: point)
        let camera = GMSCameraUpdate.setTarget(newPoint)
        mapView.animate(with: camera)

        let background = UIColor.infoWindowBackground
        customInfoWindow?.layer.backgroundColor = background.cgColor
        customInfoWindow?.layer.cornerRadius = 8
        customInfoWindow?.center = mapView.projection.point(for: position!)
        customInfoWindow?.center.y -= 100
        customInfoWindow?.CustomWindowLabel.text =  overlay.title
        customInfoWindow?.CustomWindowSubLabel.lineBreakMode = .byWordWrapping
        customInfoWindow?.CustomWindowSubLabel.numberOfLines = 0

        mapView.addSubview(customInfoWindow!)
}

func mapView(_ mapView: GMSMapView, didTap Overlay: GMSOverlay){
        initInfoWindow(overlay: overlay)
}

Теперь я хотел бы, чтобы приложение автоматически открывало определенное информационное окно, как только оно загружается.

Когда я пытаюсь вручную отобразить информационное окно при загрузке, вызвав функцию в viewDidLoad (), я должен закомментировать строку mapView.animate(with: camera), иначе плитки карты никогда не загрузятся. Кто-то указал мне, что методы mapView имеют некоторую «фоновую» информацию о оверлее, когда они вызываются, поэтому я добавил строку tappedOverlay = overlay, это близко к той части информационного окна, которая отображается при загрузке приложения. Тем не менее, эта и вся другая «обычная» информация Windows появляются без фона и не отцентрированы в точке и не могут взаимодействовать.

Окна infoWindow являются подклассом UIView, загруженным из файла XIB.

Вышеприведенный код - это то, что, как я думал, будет уместно извлечено из большей кодовой базы Дайте мне знать, если что-нибудь нужно добавить!

Любая помощь приветствуется!

1 Ответ

0 голосов
/ 07 марта 2020

Может быть, этот ответ поможет кому-то еще. Проблема была в функциях mapView.projection, они возвращали значения по умолчанию. Я не совсем уверен, но кажется, что когда вы нажимаете на маркер, mapView изменяет часть переменной frame = ( 0 0;) в фоновом режиме, поэтому это привело меня к изменению инициализации mapView.

Так что вместо ...

let camera = GMSCameraPosition.camera(withLatitude: 37, longitude: -77, zoom: 16.0)
mapView = GMSMapView.map(withFrame: CGRect.zero, camera: camera) 

Нам нужно ...

let camera = GMSCameraPosition.camera(withLatitude: LAT_OF_YOUR_INFOWINDOW, 
                                         longitude: LONG_OF_YOUR_INFOWINDOW,
                                              zoom: 16.0)
mapView = GMSMapView.map(withFrame: self.view.bounds, camera: camera)
...