目前,我正在使用适用于iOS的GoogleMaps SDK进行各种操作。 致电时
[self.googleMapsView animateToCameraPosition:[GMSCameraPosition
cameraWithLatitude:LATITUDE
longitude:LONGITUDE
zoom:ZOOM]];
是否有完成处理程序来确定动画是否完成?
当然我得到关于cameraPosition的GMSMapViewDelegate更新,但我该如何检查动画是否完成?
- (void)mapView:(GMSMapView *)mapView
didChangeCameraPosition:(GMSCameraPosition *)position;
答案 0 :(得分:18)
为了参考本文的未来读者,2013年7月发布的Google Maps SDK for iOS版本1.4.0添加了一个新的委托方法 mapView:idleAtCameraPosition:,最终会被解雇任何相机运动 - 无论是在这个问题中的程序动画还是用户触发的动作。
答案 1 :(得分:9)
这可能有效(我还没试过):
[CATransaction begin];
[CATransaction setValue:[NSNumber numberWithFloat: 1.0f] forKey:kCATransactionAnimationDuration];
[self.googleMapsView animateToCameraPosition:[GMSCameraPosition
cameraWithLatitude:LATITUDE
longitude:LONGITUDE
zoom:ZOOM]];
[CATransaction setCompletionBlock:^{
// ... whatever you want to do when the animation is complete
}];
[CATransaction commit];
基本上,这会创建一个动画事务动画来动画您的相机移动(更改numberWithFloat:
的值以更改速度),并设置自己的完成块,说明动画结束时您想要做什么。 [CATransaction commit]
是关闭动画的原因。
注意:此答案部分取决于this answer。
答案 2 :(得分:2)
我不相信有,但是......
到目前为止,对我来说效果很好的方法是在位置停止更新后立即设置定时器(非常):
- (void)mapView:(GMSMapView*)mapView didChangeCameraPosition:(GMSCameraPosition*)position {
// _panTimer is an instance variable of the delegate.
[_panTimer invalidate];
_panTimer = [NSTimer timerWithTimeInterval:0.2
target:self
selector:@selector(_mapHasStoppedMoving)
userInfo:nil
repeats:NO];
[[NSRunLoop currentRunLoop] addTimer:_panTimer forMode:NSDefaultRunLoopMode];
}
答案 3 :(得分:2)
我最近发现谷歌动画方法缺少完成处理程序的问题 到目前为止,我发现的最佳解决方案是通过CATransation API附加我自己的完成处理程序。
private func attachCompletionHandlerToGoogleAnimations(@noescape animations: () -> Void, #completion: (() -> Void)!) {
CATransaction.begin()
CATransaction.setCompletionBlock(completion)
animations()
CATransaction.commit()
}
使用示例:
attachCompletionHandlerToGoogleAnimations({
googleMapView.animateToLocation(coordinate)
}) {
println("camera moved to location \(coordinate)")
}
答案 4 :(得分:0)
SWIFT版本示例:
let vancouver = CLLocationCoordinate2D(latitude: 49.26, longitude: -123.11)
let calgary = CLLocationCoordinate2D(latitude: 51.05,longitude: -114.05)
let bounds = GMSCoordinateBounds(coordinate: vancouver, coordinate: calgary)
let cameraPosition = GMSCameraUpdate.fit(bounds)
CATransaction.begin()
CATransaction.setValue(1.0/*duration in seconds*/, forKey: kCATransactionAnimationDuration)
CATransaction.setCompletionBlock({
print("animation complete, do whatever you want here")
})
mMapView.animate(with: cameraPosition)
CATransaction.commit()