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

the*_*nke 20 uiviewanimation ios

我目前关注以下问题:

我开始动画,其中触发了2个对象属性.

代码是:

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

哪个工作正常.

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

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

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

  } completion:^(BOOL f){
Run Code Online (Sandbox Code Playgroud)

而不是例如[activityIndi​​cator ...

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

最好的祝福

Abe*_*ant 32

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

要通过转到已经位于的位置来停止移动视图的示例:

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

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

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

  • 似乎不适用于仿射变换. (2认同)

Chr*_*ris 7

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

[movingView.layer removeAllAnimations];
Run Code Online (Sandbox Code Playgroud)

  • @Ninja - removeAllAnimations尚未从API中删除,因此它应该可以运行https://developer.apple.com/library/mac/documentation/GraphicsImaging/Reference/CALayer_class/index.html (2认同)