13

現在、iOS用のGoogleMapsSDKをさまざまな操作に使用しています。電話するとき

[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 月にリリースされた Google Maps SDK for iOS バージョン 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

最近、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)")
}
于 2015-06-02T14:40:22.847 に答える
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 に答える