1

こんにちは、読んでくれてありがとう。

アニメーション ブロックを使用して単純な波のアニメーションを作成しようとしています。

[UIView animateWithDuration:0.6 delay:i*delay options:UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionAutoreverse animations:^{
        tab.frame = CGRectMake(tab.frame.origin.x,
                               tab.frame.origin.y-WAVE_SIZE,
                               tab.frame.size.width,
                               tab.frame.size.height);
    } completion:^(BOOL finished) {

        tab.frame = CGRectMake(tab.frame.origin.x,
                               tab.frame.origin.y+WAVE_SIZE,
                               tab.frame.size.width,
                               tab.frame.size.height);
    }];

問題は、アニメーションが終了したときに、ビューを以前の状態に戻そうとするときに奇妙なジャンプが入り込むことです (繰り返し効果を使用しているため) 完了ブロックに注意してください。

誰かがそのような問題に遭遇した場合は、共有してください。

再度、感謝します。

4

2 に答える 2

2

ジャックスラッシュは正しいです。この単純なシナリオで問題を解決するもう1つの簡単な方法は、アニメーションの前にフレームを保存してから、それを復元することです。

CGRect oldFrame = tab.frame;

[UIView animateWithDuration:0.6 delay:i*delay options:UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionAutoreverse animations:^{
    CGRect newFrame = oldFrame;
    newFrame.origin.y -= WAVE_SIZE;
    tab.frame = newFrame;
} completion:^(BOOL finished) {
    tab.frame = oldFrame;
}];
于 2012-10-15T15:19:51.967 に答える
2

これは、アニメーションの途中に設定されたビューのモデル値から更新されるレイヤーに関して、完了ブロックが起動するときに関係します。APIをドロップダウンせずにこの種のことを100%の時間で機能させる唯一の方法は、次のように使用するのではなくCAAnimation、アニメーションを2つの半分にチェーンするUIViewAnimationOptionAutoreverseことです。

[UIView animateWithDuration:0.3
                      delay:i*delay
                    options:UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationCurveEaseIn
                 animations:^{
                     tab.frame = CGRectMake(tab.frame.origin.x,
                                            tab.frame.origin.y-WAVE_SIZE,
                                            tab.frame.size.width,
                                            tab.frame.size.height);
                 }
                 completion:^(BOOL finished) {
                     [UIView animateWithDuration:0.3
                                           delay:0.0
                                         options: UIViewAnimationCurveEaseOut
                                      animations:^{
                                          tab.frame = CGRectMake(tab.frame.origin.x,
                                                                 tab.frame.origin.y+WAVE_SIZE,
                                                                 tab.frame.size.width,
                                                                 tab.frame.size.height);
                                      }
                                      completion:NULL];

                 }];

これにより、各アニメーションの終了時に、ビューのモデル値 (つまり、現在の位置) がアニメーションの最終フレームと同じになります。これは、そのジッター効果が得られないことを意味します。

これはUIViewAnimationOptionAutoreverse少し無意味に思えます。ビューのモデル値をアニメーションの最終フレームとは異なるままにしておくことができるのであれば、なぜそれを使用するのでしょうか? それと組み合わせると、UIViewAnimationOptionRepeat削除されるまで行ったり来たりする、かなり楽しい効果が得られます。

于 2012-10-14T21:05:10.337 に答える