Sto utilizzando i servizi di mappe di Google in iOS (Swift) e Android. In Android, la vista mappa ha un metodo chiamato animatreCamera
che ha un'animazione in cui il movimento ha un effetto "zoom indietro - zoom in" (se entrambe le fotocamere hanno lo stesso zoom, la vista della mappa ridurrà la prima parte del movimento e quindi ingrandire la seconda parte). Voglio ottenere questo effetto con il GMSMapView
in iOS, ho provato i seguenti metodi: animateToCameraPosition
, animateToLocation
, animateWithCameraUpdate
, moveCamera
e l'impostazione della fotocamera da mapView.camera = GMSCameraPosition(target: location, zoom: 15, bearing: 0, viewingAngle: 0)
e nessuno di loro ha questa animazione. Se possibile, come posso ottenere questa animazione quando si sposta la fotocamera?GMSMapView animateToCameraPosition zoom in - zoom out animazione
5
A
risposta
4
Penso che non ci sia un modo diretto per archiviare la stessa animazione nell'SDK di Google Maps.
Una soluzione può usare il metodo di iOS dispatch_after
, prima è possibile definire un metodo per ritardare il numero di secondi che si desidera:
func delay(#seconds: Double, completion:()->()) {
let popTime = dispatch_time(DISPATCH_TIME_NOW, Int64(Double(NSEC_PER_SEC) * seconds))
dispatch_after(popTime, dispatch_get_main_queue()) {
completion()
}
}
Quindi è possibile diminuire la fotocamera, passare a una posizione, poi lo zoom in con il metodo delay
:
delay(seconds: 0.5) {() ->() in
var zoomOut = GMSCameraUpdate.zoomTo(kGMSMinZoomLevel)
mapView.animateWithCameraUpdate(zoomOut)
delay(seconds: 0.5, {() ->() in
var vancouver = CLLocationCoordinate2DMake(49.26,-123.11)
var vancouverCam = GMSCameraUpdate.setTarget(vancouver)
mapView.animateWithCameraUpdate(vancouverCam)
delay(seconds: 0.5, {() ->() in
var zoomIn = GMSCameraUpdate.zoomTo(kGMSMaxZoomLevel)
mapView.animateWithCameraUpdate(zoomIn)
})
})
}
Si utilizza il proprio valore di zoom, io uso kGMSMinZoomLevel
e kGMSMaxZoomLevel
qui.
0
Swift 4:
func delay(seconds: Double, closure: @escaping() ->()) {
DispatchQueue.main.asyncAfter(deadline: .now() + seconds) {
closure()
}
}
Poi chiamarlo:
delay(seconds: 0.5) {() ->() in
let zoomOut = GMSCameraUpdate.zoom(to: 10)
self.mapView.animate(with: zoomOut)
self.delay(seconds: 0.5, closure: {() ->() in
var vancouver = CLLocationCoordinate2DMake(49.26,-123.11)
var vancouverCam = GMSCameraUpdate.setTarget(vancouver)
self.mapView.animate(toLocation: vancouverCam)
self.delay(seconds: 0.5, closure: {() ->() in
let zoomIn = GMSCameraUpdate.zoom(to: 15)
self.mapView.animate(with: zoomIn)
})
})
}