web-dev-qa-db-ja.com

iOS用Googleマップでのアニメーション期間の制御

IOS向けGoogleマップのドキュメントには次のように記載されています。

新しい場所に移動するカメラをアニメーション化できるいくつかのメソッドの1つを呼び出します。 CoreAnimationを使用してアニメーションの長さを制御できます。

私の人生では、アニメーションの長さを制御する方法がわかりません。次のようなUIViewアニメーションを使用してみました。

    [UIView animateWithDuration: 5 animations:^{
         GMSCameraPosition *camera = [self newCamera];
        self.mapView.camera = camera;
    } completion:^(BOOL finished) {
    }];

そして、CoreAnimationでCALayerアニメーションを見てきました。ただし、レイヤーアニメーションをマップビューに適用する方法がわかりません。

誰かが私を正しい方向に向けることができますか?

26
Colin Phillips

私は答えを見つけました...あなたは次のようにCATransactionでanimate *メソッドの1つをラップすることによってアニメーションの持続時間を制御することができます:

   [CATransaction begin];
   [CATransaction setValue:[NSNumber numberWithFloat: 1.0f] forKey:kCATransactionAnimationDuration];
   // change the camera, set the zoom, whatever.  Just make sure to call the animate* method.
   [self.mapView animateToCameraPosition: [self newCamera]];
   [CATransaction commit];
40
Colin Phillips

for Swift 3.0:

CATransaction.begin()
CATransaction.setValue(1.5, forKey: kCATransactionAnimationDuration)
// your camera code goes here, example:
// mapView.animate(with: update)
CATransaction.commit()

値が大きいほど(この場合は1.5)、アニメーションは遅くなります。

12
lenooh

Swift 2.0

CATransaction.begin()
CATransaction.setValue(NSNumber(float: 1.0), forKey: kCATransactionAnimationDuration)
// change the camera, set the zoom, whatever.  Just make sure to call the animate* method.
CATransaction.commit()
6
Shlomi Schwartz

あなたが提供したのと同じ方法を使用すると、アニメーションが終了したかどうかを知る方法がないというのはなんて残念なことでしょう。

はい、私は知っています、このメソッドを使用するCATransaction完了ブロックがありますが、それは単に機能しません! :(

[CATransaction begin];
[CATransaction setValue:[NSNumber numberWithFloat: 1.0f] forKey:kCATransactionAnimationDuration];

[CATransaction setCompletionBlock:^{
// ... whatever you want to do when the animation is complete
}];

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

[CATransaction commit];

そして、MapView:didIdleハックを使用して、アニメーションが終了したことを知ることはできませんなぜならカメラの位置が変更されていない場合は呼び出されません。

アニメーションが終了したイベントを検出する方法を知っている人はいますか?

これについてのスレッドが見つかりました(解決済み): CATransactionの完了がすぐに呼び出されます

2
Yaro