iOS GoogleMaps SDK - animateToCameraPosition动画完成处理程序?

时间:2013-03-04 14:36:17

标签: ios animation google-maps-mobile google-maps-sdk-ios

目前,我正在使用适用于iOS的GoogleMaps SDK进行各种操作。 致电时

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

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

当然我得到关于cameraPosition的GMSMapViewDelegate更新,但我该如何检查动画是否完成?

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

5 个答案:

答案 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()