20

「派手な」効果を与える CALayer アニメーションを作成したいと考えています。そのために、「不透明度」プロパティをアニメーション化しようとしていますが、私の問題は、どこから始めて、どのように行うべきかわからないことです。

アニメーションのグラフィカルな説明は次のとおりです。

opacity
   |    ___
1  |   |   |
   |   |   |    * repeatCount
0  |___|   |_ . . .
   -------------------------> time
    |______|
    duration

不透明度は 0 から始まり、1 にアニメーション化され、次に 0 に戻ります (この 0 から 1 から 0 へのアニメーションには、持続時間に等しい秒数がかかります)。その後、このプロセスが 'repeatCount' 回繰り返されます。

コードの背景は次のとおりです。

float duration = ...; // 0.2 secs, 1 sec, 3 secs, etc
int repeactCount = ...; // 1, 2, 5, 6, ect

CALayer* layer = ...; // I have a CALayer from another part of the code
layer.opacity = 0;

// Animation here

done = YES; // IN THE END of the animation set this ivar to yes

これを達成するための最良の方法は何ですか?これまで CALayers を使用したことがないので、アニメーション システムの仕組みを学ぶ良い機会でもあります。ところで、ドキュメントを検索したところ、1 つまたは 2 つの簡単なアニメーションを追加する方法は理解できましたが、この特定のアニメーションを行う方法がわかりません。

4

2 に答える 2

47

これを実現する最善の方法は、明示的なアニメーションを使用して (ガイドを参照)、インスタンスを作成CABasicAnimationしてレイヤーに追加することです。

コードは次のようになります。

CABasicAnimation *flash = [CABasicAnimation animationWithKeyPath:@"opacity"];
flash.fromValue = [NSNumber numberWithFloat:0.0];
flash.toValue = [NSNumber numberWithFloat:1.0];
flash.duration = 1.0;        // 1 second
flash.autoreverses = YES;    // Back
flash.repeatCount = 3;       // Or whatever

[layer addAnimation:flash forKey:@"flashAnimation"];

アニメーションがいつ終了したかを知りたい場合は、デリゲートを設定してanimationDidStop:finished:メソッドを実装できますが、すべてのコードを同じ場所に置くことができる完了ブロックを使用することをお勧めします。iOS 4 または OS X 向けに作成している場合は、優れたCAAnimationBlocksカテゴリを使用してこれを実現できます。

于 2012-09-16T17:10:11.523 に答える
2

Trojanfoe の答えは素晴らしいです。「タイムライン」をさらに制御したい場合は、それを追加したいだけです(フェードアウトするのにどれくらい時間がかかりますか?その後、どれくらい待つ必要がありますか?次に、フェードインするのにどれくらいの時間がかかりますか?など)複数CABasicAnimationの を CAAnimationGroupに結合する必要があります。

このトピックに関する私の本の章を読みたいと思うかもしれません。その最後の部分は、CAAnimation とその子孫に関するチュートリアルです。

http://www.apeth.com/iOSBook/ch17.html#_core_animation

私の議論は iOS に向けられていることに注意してください。Mac OS X では、その場合、ビュー/レイヤー アーキテクチャは少し異なりますが、CAAnimation について述べていることは依然として正しいです。

于 2012-09-16T17:20:50.110 に答える