0

我正在尝试在我的应用程序下载信息时为旋转的箭头设置动画。每半个旋转后,我希望应用程序检查数据是否已下载。如果没有,箭头应该再次旋转一半,每次旋转之间有短暂的停顿。

-(void)animation {

    [UIView animateWithDuration:0.7 delay:0 options:0 animations: ^{

        imageView.transform = CGAffineTransformMakeRotation(180 * M_PI / 180);

    } completion: ^(BOOL completed) {

        if (completed && stillReloading) {

            [self performSelector:@selector(animation) withObject:nil afterDelay:0.2];

        }

    }];  

}

即使不断调用动画函数,图像也只旋转一次。在第一个动画之后对动画函数的所有调用都将被忽略。为什么是这样?我不想在动画上设置重复选项,因为我不知道箭头会旋转多少次,而且我希望每次旋转之间有一个短暂的停顿。

4

4 回答 4

2

这条线

imageView.transform = CGAffineTransformMakeRotation(180 * M_PI / 180);

将角度设置为 180 度,仅此而已。下次调用时使用相同的角度,因此您看不到动画。

于 2013-06-24T00:56:22.897 回答
1

因为您已将动画设置为角度 (180 * M_PI / 180),所以如果您设置相同的角度,它将永远不会再次弹起。

尝试这个

CGFloat t = 180*M_PI / 180.0;
CGAffineTransform translateSpring  = CGAffineTransformRotate(CGAffineTransformIdentity, t);
[UIView animateWithDuration:0.7 delay:0.0 options:nil animations:^{

    imageView.transform = translateSpring;

} completion:^(BOOL completed) {

    if (completed && stillReloading) {
    //Use this method to let it spring back to its original angle
        [UIView animateWithDuration:0.07 delay:0.0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{
            imageView.transform = CGAffineTransformIdentity;
        } completion:NULL];
        [self performSelector:@selector(animation) withObject:nil afterDelay:0.2];
    }

}];

或者,您还可以为要转换的 imageView 设置动态更新角度。看看有没有帮助:)

根据您的问题,您可以查看我的代码,这里我使用动画将视图更改回其身份转换:

    if (completed && stillReloading) {
    //Use this method to let it spring back to its original angle
        [UIView animateWithDuration:0.07 delay:0.0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{
            imageView.transform = CGAffineTransformIdentity;
        } completion:NULL];
        [self performSelector:@selector(animation) withObject:nil afterDelay:0.2];
    }

// So if you want to transform it without getting seen, you can simply detele the animation code

    if (completed && stillReloading) {

        imageView.transform = CGAffineTransformIdentity;

        [self performSelector:@selector(animation) withObject:nil afterDelay:0.2];

    }   
于 2013-06-24T01:38:32.030 回答
1

如果要从当前位置再次旋转它,则需要使用不同的方法。 从恒等变换CGAffineTransformMakeRotation进行旋转。所以你最终得到的是:旋转到 180 度,旋转到 180 度,旋转到 180 度并且对象永远不会移动。相反,您需要使用将偏移量应用于当前变换的方法。这就是以下方法的用途:

CGAffineTransformRotate(CGAffineTransform, CGFloat)

但是,不要CGAffineTransformIdentity像 Saohooou 的回答那样将其应用于当前的视图转换。

于 2013-06-24T02:23:34.020 回答
0

你会发现要让箭头以 180 度的增量连续顺时针旋转是非常困难的。以 90 度为增量旋转它会更简单。

您需要对箭头的现有变换应用新的旋转,以每次添加更多旋转。

-(void)animateArrowRotation {
    [UIView animateWithDuration:0.35 delay:0 options:0 animations: ^{
        imageView.transform = CGAffineTransformRotate(imageView.transform, M_PI_2);
    } completion: ^(BOOL completed) {
        if (completed && stillReloading) {
            [self animateArrowRotation];
        }
    }];
}
于 2013-06-24T04:15:51.753 回答