0

特定のプロパティが変更されたときにモデルで起動する通知があります。その結果、特定のビューオブジェクトのセレクターが通知をキャッチして、それに応じてビューの位置を変更します。

通知により、ウィンドウのビューが特定の方向に移動します(常に垂直または水平に、常にウィンドウの標準のステップサイズで)。ユーザーアクションにより、複数の通知が次々に発生する可能性があります。たとえば、3つの通知を送信してビューを3ステップ下に移動し、さらに2つの通知を送信してビューを右に2ステップ移動することができます。

問題は、アニメーションを実行するときに、アニメーションが連続して発生しないことです。したがって、前の例では、ビューをゆっくりと3スペース下に移動してから、通知の結果として2スペース上に移動したいのですが、代わりに、ビューは新しい位置に斜めに移動することになります。

これが私の2つのセレクターのコードです(placePlayerはモデル内の現在の情報に従ってビューの位置を設定することに注意してください):

- (void)moveEventHandler: (NSNotification *) notification
{
    [self placePlayer];

    CABasicAnimation* moveAnimation = [CABasicAnimation animationWithKeyPath:@"position"];
    moveAnimation.duration = 3;
    moveAnimation.fillMode = kCAFillModeForwards;  // probably not necessary
    moveAnimation.removedOnCompletion = NO;        // probably not necessary
    [[self layer] addAnimation:moveAnimation forKey:@"animatePosition"];
}

このメソッドを複数回呼び出す方法についての提案は、アニメーションを一度に実行するのではなく、段階的に実行するように強制しますか?ありがとう!!

4

3 に答える 3

2

ここでやりたいことは、連続して発生する必要のあるアニメーションのキューを設定し、animationDidStop:finished:メッセージを受信するようにアニメーションデリゲートを設定することだと思います。このようにして、1つのアニメーションが完了すると、キュー内の次のアニメーションを開始できます。

于 2009-12-08T22:53:40.990 に答える
0

以下に示すように、配列内のアニメーション パスに沿って複数のポイントを提供することを検討する必要があります。

以下の例では、y 軸に沿って複数のポイントを指定していますが、アニメーションがたどるベジェ パスを指定することもできます。

基本的なアニメーションとキー フレーム アニメーションの主な違いは、キー フレームではパスに沿って複数のポイントを指定できることです。

CAKeyframeAnimation *downMoveAnimation;
downMoveAnimation = [CAKeyframeAnimation animationWithKeyPath:@"transform.translation.y"];
downMoveAnimation.duration = 12;
downMoveAnimation.repeatCount = 1;
downMoveAnimation.values = [NSArray arrayWithObjects:           
                              [NSNumber numberWithFloat:20], 
                              [NSNumber numberWithFloat:220], 
                              [NSNumber numberWithFloat:290], nil]; 
   downMoveAnimation.keyTimes = [NSArray arrayWithObjects:     
                                  [NSNumber numberWithFloat:0], 
                                  [NSNumber numberWithFloat:0.5], 
                                  [NSNumber numberWithFloat:1.0], nil]; 

   downMoveAnimation.timingFunctions = [NSArray arrayWithObjects:                                    
   [CAMediaTimingFunction     functionWithName:kCAMediaTimingFunctionEaseIn],   
        // from keyframe 1 to keyframe 2
    [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut], nil]; 
   // from keyframe 2 to keyframe 3

   downMoveAnimation.removedOnCompletion = NO;
   downMoveAnimation.fillMode = kCAFillModeForwards;
于 2012-05-03T17:47:55.577 に答える