2013-12-11 1 views
7

私はちょうどこのようなキーフレームアニメーション作成しました:キーフレームアニメーションキー時間

[UIView animateKeyframesWithDuration:10 delay:0 options:0 animations:^{ 
    [UIView addKeyframeWithRelativeStartTime:0 relativeDuration:.1 animations:^{ 
     view.alpha = 0; 
    }]; 
} completion:nil]; 

をし、これが作成されますCAKeyframeAnimationです:

(lldb) po [self.layer animationForKey:@"opacity"] 
<CAKeyframeAnimation:0x10a6364b0; keyTimes = (
    0, 
    "0.1", 
    1 
); values = (
    1, 
    0, 
    0 
); calculationMode = linear; delegate = <UIViewKeyframeAnimationState: 0x10a6358d0>; fillMode = both; timingFunction = easeInEaseOut; duration = 10; keyPath = opacity> 

質問:

全体のアニメーションは、不透明度を10 * 0.1 = 1秒間アニメーション化して10秒かかるでしょうか?アニメーションを見ると、変化は1秒以上アニメートされています。

なぜですか?

+0

デバッグ出力は、次いで0〜1秒アニメイトから100%から0%に(正しく見えます9秒間0%から0%にアニメーション化)。あなたは何を見ているのか記述できますか?不透明度をどこか別のものに変更していますか?あなたはシミュレータで遅いアニメーションをオンにしていませんか? –

+0

ええ、CAKeyframeAnimationは完全に正しいようです。私が見ているのは、不透明度が2〜2.5秒で変更されているということです。私はそれをどこでも変えず、スローアニメーションはオフになっています。 –

+1

キーフレームアニメーションを自分で作成する場合(UIViewメソッドではなく)同じことがありますか? –

答えて

8

なぜなら、アニメーションのタイミング機能は線形ではないからです。

「時間と空間は相対的な概念です。」 - 相対性理論

レイヤーやアニメーションは、各オブジェクトは、その親に依存している独自のローカル時間を持ち、その階層タイミングシステムを使用独自のタイミングパラメータ。

例えば、アニメーションには、ペーシングを定義するタイミング機能があります。 UIKitによって作成されたアニメーションのデフォルトのタイミング機能は、ゆっくりと開始し、その持続時間の途中で加速し、完了する前に再び減速するタイミングを定義する緩和緩和タイミング関数です。これは、突然開始または停止しない滑らかなアニメーションを作成します。しかし、正確なタイミングが必要なときには迷惑になるキーフレームアニメーションのキータイムでも気になります。

UIViewAnimationOptionCurveLinearオプションをanimateKeyframesWithDuration:delay:options:animations:completion:メソッドに渡すことで、容易さの容易さのタイミングを無効にすることができます。 UIViewAnimationOptionsからUIViewKeyframeAnimationOptionsに値をキャストする必要があるかどうかはわかりませんが、ドキュメントでそのことについて何も言われていません。多分よりよい(しかし、より詳細な)方法は、このような標準的なアニメーションブロック内のキーフレームアニメーションブロックを埋め込むことです。

[UIView animateWithDuration:10 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{ 
    [UIView animateKeyframesWithDuration:0 /*inherited*/ delay:0 options:0 animations:^{ 
     [UIView addKeyframeWithRelativeStartTime:0 relativeDuration:.1 animations:^{ 
      view.alpha = 0; 
     }]; 
    } completion:nil]; 
} completion:nil]; 
+0

私はUIViewKeyframeAnimationOptionCalculationModeLinear(デフォルト値)を渡していたとしても、なぜこの* $!§アニメーションが線形でないのか疑問に思って2時間過ぎました。あなたは私を救った、ありがとう。 – AncAinu

+0

私はこの答えを誤って見つけました。私は何年も前からこの問題を解決してきましたが、KeyFrameAnimationの周りに標準のUIViewアニメーションを埋め込むことで、なぜこのように「ハックする」必要があるのか​​をまだ知ることはできませんでした。それはうまくいく、私は知っているが、私の好奇心は私を悩ます:-) +1の分析。 – Unheilig

+0

@Nicolasこれは、もはやiOS 9で動作していないようです。代わりに? – Xzya