0

カスタムアニメーションを使用してアプリで作成したスピードメーターウィジェットがあり、希望どおりにアニメーション化するのに問題があります。

ピックは、渡された値に応じて特定のポイントにアニメーション化されます。範囲は0〜50です。したがって、ピックが50の場合、ピックは右端まで回転し、左側に残ります。 。ただし、ピックの開始時に常に右端までアニメートしてから、正しい位置に戻したいと思います。これは私が問題を抱えている部分です。

当面は、テスト目的ですべての値をハードコーディングしました。

ピックは最初は中央にあるので、左に回転させて表示する必要があります。

image.transform = CGAffineTransformRotate(image.transform, -0.8);

次に、右端にアニメーション化する必要があるので、これを使用します

 [UIView animateWithDuration:2.0 delay:0 options:UIViewAnimationOptionBeginFromCurrentState
                     animations:^{

                         image.transform = CGAffineTransformRotate(image.transform, 1.7);


                     }
                     completion:nil]; 

これは正常に機能するため、アプリが起動すると、ピックは左から開始し、右端まで回転します。

この最後の部分をに追加すると問題が発生します

次に、右から必要な位置まで回転させる必要があります。とりあえずこれを中心に設定しました。

 [UIView animateWithDuration:2.0 delay:2.0 options:UIViewAnimationOptionBeginFromCurrentState
                     animations:^{

                         image.transform = CGAffineTransformRotate(image.transform, -0.8);


                     }
                     completion:nil];

アプリが起動すると、ピックは右側から始まり、中央に回転します。左に回転して開始する必要がある最初の部分を無視しています。

なぜこれが起こるのか誰かが知っていますか?何年もの間これにいて、それを理解することができないようです。

編集:私はここでこのコード内に最終的なアニメーションを貼り付けてみました

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 2.0 * NSEC_PER_SEC), dispatch_get_current_queue(), ^{

        });

ピックは左から右にアニメーション化しますが、中心点にアニメーション化するのではなく、右から中心点にジャンプします:@

これを試しました:

-(void) animateToEnd : (UIImageView *)image
{

    [UIView animateWithDuration:2.0 delay:0 options:UIViewAnimationOptionBeginFromCurrentState
                     animations:^{

                         image.transform = CGAffineTransformRotate(image.transform, 1.7);
                         image.transform = CGAffineTransformIdentity;


                     }
                     completion:nil];
}
-(void) animateToFinalPosition : (UIImageView *)image
{

    [UIView animateWithDuration:2.0 delay:2.0 options:UIViewAnimationOptionBeginFromCurrentState
                     animations:^{


                         image.transform = CGAffineTransformRotate(image.transform, -0.8);
               image.transform = CGAffineTransformIdentity;

                     }
                     completion:nil];
}


-(void) speedometer : (UIImageView *)image
{
    image.transform = CGAffineTransformRotate(image_p.transform, -0.8);




   [self animateToEnd:image];
   [self animateToFinalPosition:image];


}

左から右へのアニメーションを無視し、左端から開始します

問題を修正しました。アニメーションをこれに変更しました

-(void) animateToEnd : (UIImageView *)image_p
{

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:2.0];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

    image_p.transform = CGAffineTransformRotate(image_p.transform, 1.7);

    [UIView commitAnimations];


}
-(void) animateToPosition : (UIImageView *)image_p : (float)temp
{

        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 2.0 * NSEC_PER_SEC), dispatch_get_current_queue(), ^{

            NSLog(@"Dispatch");
            [UIView beginAnimations:nil context:nil];
            [UIView setAnimationDuration:2.0];
            [UIView setAnimationDelay:0.0];
            [UIView setAnimationDelegate:self];
            [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

            image_p.transform = CGAffineTransformRotate(image_p.transform, -temp);

            [UIView commitAnimations];
        });

}

以前使用していたそのブロックコードが問題を引き起こしているようです

4

1 に答える 1

1

別のローテーションを適用する前に、単位行列をリセットしますか?

image.transform = CGAffineTransformIdentity;

リセットされない場合、各回転は前の回転の上に適用されます。これはあなたの問題の一部かもしれません。

于 2012-09-24T13:50:24.793 に答える