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 回答