UIView只会动画一次

时间:2013-06-24 00:50:23

标签: ios objective-c uiview

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

-(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 个答案:

答案 0 :(得分:2)

这一行

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

将角度设置为180度,就是这样。下次使用它被称为相同角度时,所以你看不到动画。

答案 1 :(得分: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];

    }   

答案 2 :(得分:1)

如果要从当前位置再次旋转,则需要使用其他方法。 CGAffineTransformMakeRotation通过身份转换进行轮换。所以你最终得到的结果是:旋转180度,旋转180度,旋转180度,物体不会移动。相反,您需要使用将偏移应用于当前转换的方法。这就是以下方法:

CGAffineTransformRotate(CGAffineTransform, CGFloat)

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

答案 3 :(得分: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];
        }
    }];
}