8

NSAnimationビューを別のビューで反転する2 つのオブジェクトを作成しました。これらのアニメーションを 2 つ同時に実行したいと思います。NSViewAnimationビュー プロパティのいずれかをアニメーション化するため、は使用できません。

アニメーションの作成は次のとおりです。

self.animation = [[[TransitionAnimation alloc] initWithDuration:1.0 animationCurve:NSAnimationEaseInOut] autorelease];
[self.animation setDelegate:delegate];
[self.animation setCurrentProgress:0.0];

[self.animation startAnimation];

2つのアニメーションをリンクしようとしましたが、何らかの理由で機能しなかった可能性があります。以下から例を挙げました: Apple 開発者サイト

NSAnimation使用するオブジェクトを構成してNSAnimationNonblockingも、アニメーションがまったく表示されません...

編集: 2 番目のアニメーションは最初のアニメーションとまったく同じで、最初のアニメーションと同じ場所に作成されます。

TransitionAnimationは のサブクラスでNSAnimation、 はsetCurrentProgress次のようになります。

- (void)setCurrentProgress:(NSAnimationProgress)progress {
    [super setCurrentProgress:progress];
    [(NSView *)[self delegate] display];    
}

これdelegateNSViewこの場合、drawRect 関数で a に時間依存CIFilterを適用しCIImageます。問題は、同期して実行され、最初のアニメーションが終了した直後に 2 番目のアニメーションが開始されることです。それらを同時に実行する方法はありますか?

4

1 に答える 1

19

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];

およびクラスはNSAnimationNSViewAnimationアニメーター プロキシ サポートよりもはるかに古いため、可能であればそれらから移動することを強くお勧めします。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:、アニメーションの現在の値を確認できます。

于 2012-04-16T04:49:07.913 に答える