iOS的GoogleMaps SDK – animateToCameraPositionanimation完成处理程序?

目前我正在使用iOS的GoogleMaps SDK进行各种操作。 打电话时

[self.googleMapsView animateToCameraPosition:[GMSCameraPosition cameraWithLatitude:LATITUDE longitude:LONGITUDE zoom:ZOOM]]; 

是否有完成处理程序来确定animation是否完成?

当然,我得到有关cameraPosition的GMSMapViewDelegate更新,但我应该如何检查animation是否完成?

 - (void)mapView:(GMSMapView *)mapView didChangeCameraPosition:(GMSCameraPosition *)position; 

为了供本文的未来读者参考,2013年7月发布的iOS版Google地图SDK 1.4.0已经添加了一个新的委托方法mapView:idleAtCameraPosition:它将在任何摄像机运动结束时被触发 – 无论是程序化animation在这个问题或用户触发的动作。

这可能工作(我没有尝试过):

 [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]; 

基本上,这会创build一个animation交易,animation您的相机移动(更改numberWithFloat:的值numberWithFloat:更改速度),并设置您自己的完成块,说明animation结束时要执行的操作。 [CATransaction commit]是closuresanimation。

注意:这个答案部分基于这个答案 。

不过我不相信

到目前为止,我工作得很好的一种方法是设置一个定时器,在定位停止更新之后立即开始:

 - (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]; } 

我遇到最近缺乏完成处理程序的谷歌animation方法的问题。
目前为止我发现的最好的解决scheme是通过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)") }