簡體   English   中英

iOS GoogleMaps SDK-animateToCameraPosition動畫完成處理程序?

[英]iOS GoogleMaps SDK - animateToCameraPosition animation finished handler?

目前,我正在使用iOS版GoogleMaps SDK進行各種操作。 打電話時

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

是否有完成處理程序來確定動畫是否完成?

當然,我可以通過GMSMapViewDelegate獲得有關cameraPosition的更新,但是如何檢查動畫是否完成?

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

為便於以后的讀者參考,2013年7月發布的iOS版Google Maps SDK 1.4.0已添加了一個新的委托方法mapView:idleAtCameraPosition:它將在任何照相機運動結束時觸發-無論是像程序動畫一樣在這個問題或用戶觸發的動作。

這可能有效(我沒有嘗試過):

[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]會觸發動畫。

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

我不相信有...

到目前為止,對我來說效果很好的一種方法是在位置停止更新后不久設置一個計時器(非常)觸發:

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

我最近遇到了缺少完成處理程序的Google動畫方法的問題。
到目前為止,我找到的最好的解決方案是通過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)")
}

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM