0

ブロックを使用して、同じUIImageViewで2つのアニメーションを実行しています。アニメーションは完全に連続しているわけではありませんが、ほとんどです。間にいくつかのロジックがあります。

  • ビューのある場所から別の場所にUIImageViewをアニメーション化します。
  • 画像をそこにとどまらせるかどうかを決定するロジックを実行する
  • 許可されていない場合は、アニメーションを元に戻します(UIImageViewは元の場所に戻ります)

上記のようにこれを実装すると、2番目のアニメーションのみが表示されます(これは私が理解していることからの正常な動作です)。最初のアニメーションの完了ブロック内にロジックと2番目のアニメーションブロックをネストすると、両方のアニメーションが表示されますが、その完了ブロックにかなりの量のコードが詰まっていて、見苦しくて場違いに見えます。

ネストされていない構成で、iOSが前のアニメーションを短くして最後のアニメーションのみを実行したいのはなぜですか?また、次のアニメーションに進む前に最初のアニメーションを待機させるにはどうすればよいですか?メインスレッドをブロックしたり、完了ブロックで「座ってスピン」したりする必要はないと思います。すべてのアニメーションを表示したいだけです。2番目のアニメーションに遅延を追加しようとしましたが無駄になりました。

これはCAKeyframeAnimationの仕事ですか?

// first animation

[UIView animateWithDuration:0.5
                      delay:0.0
                    options: UIViewAnimationCurveLinear
                 animations:^{movingColor.center = newCenter;
                     movingColor.transform = scaleTransform;}
                 completion:^(BOOL finished){ NSLog(@"forward animation done");}];

if (/* ...color is allowed at that location */) {

    // do some stuff

} else {

    // undo the animation

    [UIView animateWithDuration:0.5
                          delay:0.0
                        options: UIViewAnimationCurveLinear
                     animations:^{movingColor.center = origCenter;
                         movingColor.transform = scaleTransform;}
                     completion:^(BOOL finished){ NSLog(@"back animation done");}];
}
4

3 に答える 3

1

それを行う正しい方法は、あなたが言ったように、正しい方法である最初のものの完成に2番目のものを設定することです、

他の開始時に遅延を追加することもできます。これは、多くの変数に応じて機能する場合と機能しない場合があります。

2番目のアニメーションには0.5の遅延があります(最初のアニメーションが完了するまでの時間)

[UIView animateWithDuration:0.5
                      delay:0.5
                    options: UIViewAnimationCurveLinear
                 animations:^{movingColor.center = origCenter;
                     movingColor.transform = scaleTransform;}
                 completion:^(BOOL finished){ NSLog(@"back animation done");}];
于 2012-06-17T14:35:05.570 に答える
1

animateWithDuration非同期で実行され、すぐに戻ります。つまり、アニメーションの終了を待たずに次のコード行が実行されます。アニメーションの終了後にコードを実行する場合は、ブロックにコードを配置するかcompletion、2 番目のアニメーションがすぐに開始されることを受け入れます (したがって、最初のアニメーションはキャンセルされます)。

アニメーションを開始しても完了しないことで何かが間違っていることをユーザーに示したい場合は、2 番目のアニメーションを遅延して実行できます。UIViewAnimationOptionBeginFromCurrentState最初のアニメーションより短い時間で 2 番目のアニメーションを遅らせる場合は、オプションも忘れずに設定してください。

[UIView animateWithDuration:0.5 
                      delay:0.25 //or some number
                    options: (UIViewAnimationCurveLinear | UIViewAnimationOptionBeginFromCurrentState)
                 animations:^{movingColor.center = origCenter;
                     movingColor.transform = scaleTransform;}
                 completion:^(BOOL finished){ NSLog(@"back animation done");}];
于 2012-06-17T14:44:01.857 に答える
1

2 番目のアニメーションは、最初の完了ブロック内で条件付きで実行する必要があります。関数に入れると読みやすくなります。

- (void)moveColor:(UIView *)view to:(CGPoint)center delay:(NSTimeInterval)delay completion:(void (^)(BOOL finished))complete {

    [UIView animateWithDuration:0.5 delay:delay options:UIViewAnimationCurveLinear animations:^{
        view.center = center;
        view.transform = scaleTransform;  // probably don't need this
    } completion:completion];
}

このようにして、ロジックをアニメーション コードから分離できます。

- (void)someMethod {

    [self moveColor:movingColor to:newCenter delay:0.0 completion:^(BOOL finished) {
        if (/*it can stay*/) {
            // stuff
        } else {
            [self moveColor:movingColor to:origCenter delay:2.0 completion:^(BOOL finished) {}];
        }
    }];
}
于 2012-06-17T14:44:09.183 に答える