2

2回動かそうとしてUILabelいますが、奇妙な動作をしています。これが私の最初のアニメーションです:

- (IBAction)doAnimation:(id)sender
{
    CGRect labelFrame = self.label.frame;
    CGRect newFrame = CGRectMake((random() / (float)RAND_MAX) * self.view.frame.size.width,
                                 (random() / (float)RAND_MAX) * self.view.frame.size.height,
                                 labelFrame.size.width,
                                 labelFrame.size.height);
    [UIView animateWithDuration:2
                          delay:0
                        options:0
                     animations:^{
                         self.label.frame = newFrame;
                     }
                     completion:NULL];
}

これは完全に機能します。ラベルは移動中にフェードインします。

次に、このコードを最後に追加して、2 番目の遅延アニメーションを追加しましたdoAnimation:

    CGRect newFrame2 = CGRectMake((random() / (float)RAND_MAX) * self.view.frame.size.width,
                          (random() / (float)RAND_MAX) * self.view.frame.size.height,
                          labelFrame.size.width,
                          labelFrame.size.height);
    [UIView animateWithDuration:2
                          delay:3
                        options:0
                     animations:^{
                         self.label.frame = newFrame2;
                     }
                     completion:NULL];

この場合、私は別の振る舞いをします。ラベルは最初のアニメーションの最後にジャンプし、遅延が終了するのを待ってから、2 番目の動きをアニメーション化します。

好奇心から、アニメーション 1 の 2 つのプロパティをアニメーション化してみました。

animations:^{
                 self.label.frame = newFrame;
                 self.label.alpha = 1.0f;
             }

アルファは正しくアニメーション化されますが、フレームの変更は正しくありません。

アニメーション 2 にアルファの変更を追加すると、アニメーション 1 ではアルファがアニメーション化されません (代わりに、最後にジャンプするだけです)。

遅延アニメーションを使用して、同様のプロパティでアニメーション シーケンスを作成することは可能ですか? ユーザーの入力に応じて、これを任意の数のアニメーションに拡張する必要があります。

4

2 に答える 2

0

これに対する解決策を見つけました。ここにあります。

ポイントする任意の数の座標を保存する配列を追加しました。

@property (nonatomic, retain) NSMutableArray* animationCoordinates;

次に、アニメーション シーケンスを起動する前に、配列にビューを追加します。

次のアニメーションを起動するメソッドも追加しました。

- (void)playNextAnimation
{
    if (self.animationCoordinates.count > 0)
    {
        CGPoint point = [[self.animationCoordinates objectAtIndex:0] CGPointValue];
        CGRect labelFrame = self.label.frame;
        CGRect newFrame = CGRectMake(point.x,
                                     point.y,
                                     self.originalHandFrame.size.width,
                                     self.originalHandFrame.size.height);
        [self animateWithDuration:2.0
                            delay:0.0
                       animations:^{
                           self.label.frame = newFrame;
                           self.label.alpha = 1.0f;
                       }
                       completion:^(BOOL success){
                           [self playNextAnimation];
                       }];
        [self.buttonsToAnimate removeObjectAtIndex:0];
    }
}

アニメーションを開始したいときは、電話するだけです

[self playNextAnimation];

これにより、すべてのポイントが訪問されるまで、アニメーションが順番に再生されます。

于 2013-05-24T14:49:04.650 に答える