8

これまで、とのおかげで、CALayerサブクラスのカスタムプロパティをアニメーション化することができまし+ (BOOL)needsDisplayForKey:(NSString *)keyCABasicAnimations

animationDidStop:finished:ただし、すべてのコードが1つのメソッドで実行されるため、アニメーションの連鎖は非常に難しい場合があります。

そこで、新しいブロック構文をサポートしているので、に切り替えたいと思いましたCATransactions。これにより、で完了ブロックを指定できるようになります+ (void)setCompletionBlock:(void (^)(void))block

しかし、CATransactionいわゆる「アニメーション化可能なプロパティ」しかアニメーション化できないように見え、needsDisplayForKey:実装されたメソッドを使用しても、カスタムレイヤープロパティでは機能しません。

CALayerでは、でアニメーション化するカスタムプロパティを作成する方法はありCATransactionますか?

編集: 私の意図は、線に沿って何かをすることです:

[CATransaction begin];
[CATransaction setAnimationDuration:0.5];
[CATransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[CATransaction setCompletionBlock:^{
    NSLog(@"blabla");
}];

myLayer.myProperty = newValue;

[CATransaction commit];

myProperty値のへの更新はnewValueアニメーション化されません。actionForLayer:forKey:myLayerを管理するビューに実装 して、を返すようにしましたCABasicAnimation。ただしactionForLayer:forKey:、キーで呼び出されることはありませんmyProperty。はい、それはサブレイヤーに過ぎmyLayerません。はい、view.layerのデリゲートをmyLayer包含ビューに設定しました。

4

2 に答える 2

10

私がいくつかのソースコードを読んだことに基づいて、あなたはまだCABasicAnimation内で使用できると信じていますCATransaction。とCAAnimationsの間に追加されたものはすべて、トランザクションの一部である必要があります。[CATransaction begin][CATransaction commit]

[CATransaction begin];
[CATransaction setAnimationDuration:0.5];
[CATransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[CATransaction setCompletionBlock:^{
    NSLog(@"blabla");
}];

// Create the CABasicAnimation using your existing code
CABasicAnimation *myPropertyAnim = [CABasicAnimation animationWithKeyPath:@"myProperty"];
// TODO: Setup animation range
myPropertyAnim.toValue = newValue;

// The CATransaction does not observe arbitrary properties so this fails:
//myLayer.myProperty = newValue;

// Add the CAAnimation subclass during the CATransaction
[myLayer addAnimation:myPropertyAnim forKey:@"myKey"];

[CATransaction commit];

これを簡単にテストするためのプロジェクト設定がないことをお詫びしますが、うまくいくと思います。

コードについては、次のサイトを確認してください。

私が参照したコード:

[CATransaction begin];
[topLayer addAnimation:topAnimation forKey:@"flip"];
[bottomLayer addAnimation:bottomAnimation forKey:@"flip"];
[CATransaction commit];
于 2010-11-09T14:07:15.900 に答える
1

CAAnimationBlocksと呼ばれるすばらしいクラスがあり、ここで説明します。これは、UIViewの場合と同じように完了ブロックを使用できるCAAnimationのカテゴリです。

次のコマンドを呼び出すだけで使用できます。

CABasicAnimation myAnimation;
[myAnimation setCompletion:^(BOOL finished) { // Do something }];
于 2011-12-22T16:38:16.207 に答える