如何中断 UIView 动画

Posted

技术标签:

【中文标题】如何中断 UIView 动画【英文标题】:How to Interrupt UIView Animation 【发布时间】:2014-05-09 13:21:46 【问题描述】:

我已尝试遵循其他几个线程的建议,但他们的方法似乎在这种情况下不起作用。这是我的情况:

我有 2 个滚动视图。 “滚动视图 A”具有在滚动“滚动视图 A”时淡入和淡出的标签。拖动“滚动视图 B”时,我想立即隐藏“滚动视图 A”上的标签。但是我不能打断标签的缓慢淡出动画。 以下是我使用的两种方法:

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView


if (scrollView.tag != 1)

    [UIView animateWithDuration:1 delay:0 options:UIViewAnimationOptionCurveEaseIn | UIViewAnimationOptionBeginFromCurrentState animations:^

        self.liveOverlayLabel.alpha = .6;
     completion:^(BOOL finished) 
    ];


else


    [UIView animateWithDuration:0 delay:0 options:UIViewAnimationOptionCurveEaseIn | UIViewAnimationOptionBeginFromCurrentState animations:^

        self.liveOverlayLabel.alpha = 0;
     completion:^(BOOL finished) 
        self.liveOverlayLabel.alpha = 0;
    ];



-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate


if (scrollView.tag != 1)


        NSLog(@"stoppping");
    [UIView animateWithDuration:5 delay:0 options:UIViewAnimationOptionCurveEaseIn animations:^

        self.liveOverlayLabel.alpha = 0;
     completion:^(BOOL finished) 
    ];

else

    self.liveOverlayLabel.alpha = 0;




【问题讨论】:

Cancel a UIView animation?的可能重复 【参考方案1】:

UIView 动画最终在“幕后”使用视图层上的 CAAnimation 对象。

要停止“飞行中”动画,您可以使用如下代码:

目标-C:

[aView.layer removeAllAnimations];

斯威夫特:

aView.layer.removeAllAnimations()

我相信对于 UIView 动画,当动画被移除时,视图会跳转到它的结束状态。

另一个海报使用带有 UIViewAnimationOptionBeginFromCurrentState 选项的新动画的方法可以让您添加一个新动画,该动画开始使用新动画开始时的动画状态作为起点对视图的新变化进行动画处理。

因此,如果您要从屏幕的左下角到右下角为视图设置动画,并且在动画进行到一半时,您会发出一个新的 UIView 动画,将视图移动到 top 右侧,使用UIViewAnimationOptionBeginFromCurrentState 选项,视图将改变方向,从中间点开始,并开始移动到右上角。

【讨论】:

谢谢,[self.liveOverlayLabel.layer removeAllAnimations] 为我做了。 在我的情况下,动画被呈现的 imagePicker 打断。我必须重新启动动画。你找到原因了吗?【参考方案2】:

在我的情况下,运行视图动画无法通过调用中断

删除所有动画

在视图层上。

根据这篇文章:

How to interrupt UIView animation before completion?

还有另一种方式。您可以致电:

UIView.animate(withDuration: 0, delay: 0, options: .beginFromCurrentState, 
    animations: 
       // perhaps a "closing" animation
    , 
    completion:  _ in
      // reset specific view state
    )

beginFromCurrentState 选项截取当前正在运行的动画并将其替换为动画块中提到的动画。如果持续时间为 0,这会立即发生。

【讨论】:

以上是关于如何中断 UIView 动画的主要内容,如果未能解决你的问题,请参考以下文章

动画中断时未调用 UIView 动画完成块

UIVIew 块动画后用户交互中断

自动布局中断 UIView 动画

使用 Swift 在单个 UIView 上同时进行多个动画

使用图像为 UIView 的位置和大小设置动画的正确方法(此方法在 Xcode 6 中中断)?

如何暂停和恢复 UIView 动画(没有块动画)?