如何取消UIViews基于块的动画?

时间:2011-11-01 13:47:34

标签: ios uiviewanimation

我目前关注以下问题:

我开始动画,触发2个物体属性。

代码是:

    [UIView animateWithDuration:0.3 animations:^{
        greyscaleImage.alpha     = 1;
        activityIndicator.alpha  = 1;
    } completion:^(BOOL f){
        if(f)
        {
            [activityIndicator startAnimating];
        }
    }];

工作正常。

我发现的唯一问题是,当我释放持有此activityIndi​​cator和greyscaleImage的视图时,我有0.3秒的更改来崩溃应用程序。

为了更清楚,请想象一下ViewController,它的视图通过默认的iOS模式-View方式呈现。现在触发该动画,需要2分钟。在达到2分钟之前,你会发现动画很无聊,你想要忽略那个视图。现在,发布了view,activityIndi​​cator和greyscaleImage,动画o / c无法知道该怎么做。

所以我想知道,在这里做什么+为什么调试器指向

  } completion:^(BOOL f){

代替例如[activityIndi​​cator ...

有没有办法,允许用户在2分钟结束前解除视图?

最好的问候

4 个答案:

答案 0 :(得分:32)

如果您开始一个需要0.0秒并进入您想要进入的状态的新动画,它将取消旧动画并启动新的(即时)'动画'。

当你想通过前往它所在的地方来停止移动视图时的示例:

[UIView animateWithDuration:0.0
                      delay:0.0
                    options:UIViewAnimationOptionBeginFromCurrentState
                 animations:^{movingView.frame = ((CALayer *)movingView.layer.presentationLayer).frame;}
                 completion:^(BOOL finished){}
 ];

选项:UIViewAnimationOptionBeginFromCurrentState很重要。不调用它会让动画从上一个动画的结束状态开始。在运动中,它会在翘曲到你希望它停在的地方之前变形到最终位置。即使你的取消 - '动画'是即时的,也可以看到来回跳跃。

注意:动画时间不一定是0.0秒,任何动画都会取消旧动画。但不完全确定不同类型的动画。例如,我不知道更换框架是否会阻止淡入淡出。

答案 1 :(得分:7)

您可以从视图图层中删除所有动画

[movingView.layer removeAllAnimations];

答案 2 :(得分:1)

阻止将在它们启动后始终完成,并且无法停止(除非您使应用程序崩溃)。您可能希望使用通知中心或NSTimer来手动更改帧。

答案 3 :(得分:1)

设置动画选项UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionAllowUserInteraction对我有用。

像这样使用:

[UIView animateWithDuration:0.5
                          delay:0.0
         usingSpringWithDamping:0.7
          initialSpringVelocity:0
                        options:UIViewAnimationOptionAllowAnimatedContent | UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionAllowUserInteraction
                     animations:^{
                    // Do your stuff here, like changing the frame etc.
                    self.containerView.frame = CGRectMake(0, 100, 300, 300);
    } completion:nil];