3

animateWithDuration: メソッドを使用して、iOS でアニメーションを作成しようとしています。

画面上で画像 (UIImageView の雲の単純な画像) を移動してから、そのアニメーションをループで実行し、画面を横切るたびに速度 (期間) を変更したいと考えています。

いくつかの方法を試しましたが、どちらも正しく動作しません。

最初に、次のように UIViewAnimationOptionRepeat を使用できます。

[UIImageView animateWithDuration:arc4random() % 10 + 1
                           delay:0.0
                         options:UIViewAnimationOptionCurveLinear | UIViewAnimationOptionRepeat
                      animations:^{
 //moving the cloud across the screen here
}
completion:^(BOOL finished) {
    NSLog(@"Done!");
}];

しかし、これは継続時間をリセットするためにarc4random()を再度呼び出すようには見えません...つまり、アニメーションがループするたびではなく、アプリが開始されるたびにのみ、雲がランダムな速度で画面を横切ります。

次に、完了ブロックを使用して、次のようにアニメーションを再度起動しようとしました:

-(void)animateMethod
{
[UIImageView animateWithDuration:arc4random() % 10 + 1
                           delay:0.0
                         options:UIViewAnimationOptionCurveLinear
                      animations:^{
 //moving the cloud across the screen here
}
completion:^(BOOL finished) {
    NSLog(@"Done!");
    [self animateMethod];
}];
}

これにより、私が探している効果が得られますが、ナビゲーションコントローラーを使用して別のビューにプッシュすると、完了ブロックが無限ループで発生するようです(私のログは「完了!」でスパムされます)

適切な方法が必要な目的の効果を得る方法を知っている人はいますか?

4

1 に答える 1

5

あなたは正しい方向に進んでいます。重要なのは、アニメーションが失敗した場合ではなく、終了した場合にのみループする必要があるということです。finished BOOLしたがって、ループするように指示する前に、がtrueであるかどうかを確認する必要があります。

-(void)animateMethod
{
    [UIImageView animateWithDuration:arc4random() % 10 + 1
                               delay:0.0
                             options:UIViewAnimationOptionCurveLinear
                          animations:^{
     //moving the cloud across the screen here
    }
    completion:^(BOOL finished) {
        if (finished) {
            NSLog(@"Done!");
            [self animateMethod];
        }
    }];
}

この方法は、このような非常に単純なアニメーションや、一度に3〜5個のクラウドなど、数個しか実行していない場合に最適です。これ以上のものは、NSTimerまたはCADisplayLinkを使用して独自のアニメーションループを設定し、その中の雲のフレームを調整することをお勧めします。それははるかに手動の方法ですが、UIKitでもいくつかの素晴らしいアニメーションが得られます。

于 2013-01-24T18:30:08.010 に答える