NSAnimation
複数のオブジェクトとそのプロパティを同時にアニメーション化する場合、実際には最良の選択ではありません。
NSAnimatablePropertyContainer
代わりに、ビューをプロトコルに準拠させる必要があります。
次に、複数のカスタム プロパティをアニメート可能として設定し ( で既にサポートされているプロパティに加えてNSView
)、ビューのanimator
プロキシを使用してプロパティをアニメートすることができます。
yourObject.animator.propertyName = finalPropertyValue;
アニメーションを非常にシンプルにするだけでなく、 を使用して複数のオブジェクトを同時にアニメーション化することもできますNSAnimationContext
。
[NSAnimationContext beginGrouping];
firstObject.animator.propertyName = finalPropertyValue1;
secondObject.animator.propertyName = finalPropertyValue2;
[NSAnimationContext endGrouping];
期間を設定し、完了ハンドラ ブロックを提供することもできます。
[NSAnimationContext beginGrouping];
[[NSAnimationContext currentContext] setDuration:0.5];
[[NSAnimationContext currentContext] setCompletionHandler:^{
NSLog(@"animation finished");
}];
firstObject.animator.propertyName = finalPropertyValue1;
secondObject.animator.propertyName = finalPropertyValue2;
[NSAnimationContext endGrouping];
およびクラスはNSAnimation
、NSViewAnimation
アニメーター プロキシ サポートよりもはるかに古いため、可能であればそれらから移動することを強くお勧めします。NSAnimatablePropertyContainer
プロトコルをサポートすることは、すべてのデリゲートを管理するよりもはるかに簡単です。NSAnimation
カスタム タイミング関数と完了ハンドラに対する Lion のサポートにより、その必要がまったくなくなりました。
標準NSView
オブジェクトの場合、ビュー内のプロパティにアニメーション サポートを追加する場合は、ビュー内の+defaultAnimationForKey:
メソッドをオーバーライドして、プロパティのアニメーションを返すだけです。
//declare the default animations for any keys we want to animate
+ (id)defaultAnimationForKey:(NSString *)key
{
//in this case, we want to add animation for our x and y keys
if ([key isEqualToString:@"x"] || [key isEqualToString:@"y"]) {
return [CABasicAnimation animation];
} else {
// Defer to super's implementation for any keys we don't specifically handle.
return [super defaultAnimationForKey:key];
}
}
プロトコルを使用してビューの複数のプロパティを同時にアニメーション化する方法を示す簡単なサンプル プロジェクトを作成しました。NSAnimatablePropertyContainer
ビューを正常に更新するために行う必要があるsetNeedsDisplay:YES
のは、アニメーション化可能なプロパティのいずれかが変更されたときに が呼び出されることを確認することだけです。次に、メソッドでこれらのプロパティの値を取得し、drawRect:
それらの値に基づいてアニメーションを更新できます。
の動作に似た単純な進捗値が必要な場合は、ビューでプロパティをNSAnimation
定義してから、次のようにすることができます。progress
yourView.progress = 0;
[yourView.animator setProgress:1.0];
その後、メソッドにアクセスself.progress
してdrawRect:
、アニメーションの現在の値を確認できます。