13

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

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

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

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

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

5 回答 5

18

为了给这篇文章的未来读者提供参考,2013 年 7 月发布的适用于 iOS 的 Google Maps SDK 1.4.0 版添加了一个新的委托方法mapView:idleAtCameraPosition:它将在任何相机移动结束时触发 - 无论是像程序动画这样的在这个问题或用户触发的动作中。

于 2013-07-27T12:04:55.460 回答
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]是什么触发了动画。

注意:此答案部分基于此答案

于 2013-05-19T08:59:04.387 回答
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];
}
于 2013-03-11T00:42:19.297 回答
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)")
}
于 2015-06-02T14:40:22.847 回答
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()
于 2018-12-12T22:45:11.330 回答