カスタムアニメーションを使用してアプリで作成したスピードメーターウィジェットがあり、希望どおりにアニメーション化するのに問題があります。
ピックは、渡された値に応じて特定のポイントにアニメーション化されます。範囲は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];
});
}
以前使用していたそのブロックコードが問題を引き起こしているようです