GMSMapView animateToCameraPosition 放大-缩小动画
GMSMapView animateToCameraPosition zoom in - zoom out animation
我在 iOS (Swift) 和 Android 中使用 Google 地图服务。在 android 中,地图视图有一个名为 animatreCamera
的方法,它有一个动画,其中的移动具有 "zoom out - zoom in" 效果(如果两个相机具有相同的缩放,地图视图将缩小移动的第一部分,然后放大第二部分)。我想用iOS中的GMSMapView
实现这个效果,我尝试了以下方法:animateToCameraPosition
、animateToLocation
、animateWithCameraUpdate
、moveCamera
并通过 mapView.camera = GMSCameraPosition(target: location, zoom: 15, bearing: 0, viewingAngle: 0)
和 none 设置相机有这个动画。如果可以,移动相机时如何实现这个动画?
我认为没有直接的方法可以在 Google 地图 iOS SDK 中存档相同的动画。
解决方法可以使用iOS的dispatch_after
方法,首先你可以定义一个方法来延迟你想要的秒数:
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()
}
}
然后您可以缩小相机,移动到某个位置,然后使用 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)
})
})
}
你用自己的缩放值,我这里用kGMSMinZoomLevel
和kGMSMaxZoomLevel
Swift 4:
func delay(seconds: Double, closure: @escaping () -> ()) {
DispatchQueue.main.asyncAfter(deadline: .now() + seconds) {
closure()
}
}
然后调用它:
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)
})
})
}
我在 iOS (Swift) 和 Android 中使用 Google 地图服务。在 android 中,地图视图有一个名为 animatreCamera
的方法,它有一个动画,其中的移动具有 "zoom out - zoom in" 效果(如果两个相机具有相同的缩放,地图视图将缩小移动的第一部分,然后放大第二部分)。我想用iOS中的GMSMapView
实现这个效果,我尝试了以下方法:animateToCameraPosition
、animateToLocation
、animateWithCameraUpdate
、moveCamera
并通过 mapView.camera = GMSCameraPosition(target: location, zoom: 15, bearing: 0, viewingAngle: 0)
和 none 设置相机有这个动画。如果可以,移动相机时如何实现这个动画?
我认为没有直接的方法可以在 Google 地图 iOS SDK 中存档相同的动画。
解决方法可以使用iOS的dispatch_after
方法,首先你可以定义一个方法来延迟你想要的秒数:
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()
}
}
然后您可以缩小相机,移动到某个位置,然后使用 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)
})
})
}
你用自己的缩放值,我这里用kGMSMinZoomLevel
和kGMSMaxZoomLevel
Swift 4:
func delay(seconds: Double, closure: @escaping () -> ()) {
DispatchQueue.main.asyncAfter(deadline: .now() + seconds) {
closure()
}
}
然后调用它:
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)
})
})
}