2013-11-14 15 views
34

CAAnimationの終了後に完了ブロックを実行しようとしています。しかし、アニメーションブロックがアニメーションが完了する前に呼び出されたようです。しかし、アニメーションはまだ正しく発生します。CATransactionの完了がすぐに呼び出される

[CATransaction begin]; 
[self.view.layer addAnimation:self.dropAndBounceAnimation forKey:@"appearance"]; 
[CATransaction setCompletionBlock:completionBlock]; 
[CATransaction commit]; 

dropAndBounceAnimationは、position.yのCAKeyFrameAnimationであり、固定期間があります。

答えて

81

これは本当に正しい修正であるかどうかはわかりませんが、の前に補完ブロックを設定すると、レイヤーのアニメーションが追加された時点で完了ブロックが一貫して正しい時刻に呼び出されます。

[CATransaction begin]; 
[CATransaction setCompletionBlock:completionBlock]; 
[self.view.layer addAnimation:self.dropAndBounceAnimation forKey:@"appearance"]; 
[CATransaction commit]; 
+19

はいそれは[ドキュメント]の通りである(https://developer.apple.com/library/ Mac/DOCUMENTATION/GraphicsImaging/Reference/CATransaction_class/Introduction/Introduction.html#// apple_ref/occ/clm/CATransaction/setCompletionBlock :): "(メインスレッド上で)すぐに呼び出されることが保証されている完了ブロックオブジェクトその後このトランザクショングループによって追加されたすべてのアニメーションは完了した(または削除された)。 "キー部分は「後で追加されます」。 – albertamg

+2

@albertamgただし、現在のトランザクショングループがコミットされる前にアニメーションが追加されていない(または完了ブロックが別の値に設定されている)場合、ブロックは直ちに呼び出されます。 ' – iwasrobbed

+1

@iWasRobbed yes、トランザクショングループにアニメーションを追加した後でアニメーションが完了する前にブロックが呼び出された理由 – albertamg

10

アニメーションを追加する前にアニメーションブロックを設定する必要があります。

[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]; 

このビューでは、アニメーションの完了後に完了ブロックがトリガーされなければなりません。それが役に立てば幸い。親指;)

2

ここで、Xcodeの8 スイフト3.0.1あるバージョン:

CATransaction.begin() 

CATransaction.setCompletionBlock({ 
    print("Transaction completed") 
}) 

print("Transaction started") 
view.layer.add(dropAndBounceAnimation, forKey: "appearance") 

CATransaction.commit() 
関連する問題