2012-04-05 11 views
13

UIViewアニメーションブロック内に、現在のアニメーションの時間を取得する方法はありますか?現在のアニメーションブロックのアニメーションの長さを確認します

[UIView animateWithDuration:1.0 animations:^{ 
    // float duration = ? 
}]; 
+0

アニメーションの時間が1.0にならないのはわかりませんが、 –

+2

はい、しかし、ブロック内のコンポーネントを使用して期間を知っている必要があり、変数として継続時間を渡したくありません。 – adamsiton

+0

良い質問+1すみませんでした。 –

答えて

0

ブロックを使用しているので、変数を取り込むのはなぜですか。

CGFloat duration = 1.0; 
[UIView animateWithDuration:duration animations:^{ 
    CGFloat theDuration = duration; 
}]; 
+0

同意します。私たちはすでに持続時間を過ごしています。それでは、別の方法でそれを見つけるべきです。 – Mrug

2

[CATransaction animationDuration]あなたはあなたが簡単に十分な現在のアニメーションを得ることができます

+0

残念ながらそれは動作しません、UIViewアニメーションブロックは明らかにCATransactionで直接動作しません。 –

2

探しているものです。例えば、CATransaction設定:

CAAnimation *animation = [self.layer animationForKey:self.layer.animationKeys.firstObject]; 
[CATransaction begin]; 
[CATransaction setAnimationDuration:animation.duration]; 
[CATransaction setAnimationTimingFunction:animation.timingFunction]; 

// CALayer animation here 

[CATransaction commit]; 
2

TL; DR:-animationForKeyないのCALayer -actionForKey :,使用:

@Dimitri Bouniolの答えは私のために動作しませんでしたが、ANから呼び出された場合影響を受ける設定者をアニメーションブロック内に配置します。理由は、私の理解から、UIViewのアニメーションシステムは、実際のアニメーションを開始する前に状態を設定している(そして、実際のアニメーションを開始する前にセッターを呼び出す)からです。レイヤー上で同様の-actionForKey:メソッドを呼び出すと、私にとってはうまくいきました。返されるアクションには適切な期間が設定されていて、その答えにそのまま使用できます。

CAAnimation *animation = (CAAnimation*) 
[self.layer [email protected]"position"]; // or property of interest 

[CATransaction begin]; 
[CATransaction setAnimationDuration:animation.duration]; 
[CATransaction setAnimationTimingFunction:animation.timingFunction]; 

// CALayer animation here 

[CATransaction commit]; 
関連する問題