如何中断UIView动画

时间:2014-05-09 13:21:47

标签: ios objective-c uiview

我已经尝试过关于其他几个主题的建议,但他们的方法在这种情况下似乎不起作用。这是我的情况:

我有2个滚动视图。 "滚动视图A"滚动时有一个淡入淡出的标签"滚动查看A"。当"滚动查看B"被拖动我想立即隐藏标签" Scroll View 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;

}

}

2 个答案:

答案 0 :(得分:7)

UIView动画最终使用“隐藏”视图层上的CAAnimation对象。

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

目标C:

[aView.layer removeAllAnimations];

夫特:

aView.layer.removeAllAnimations()

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

使用具有UIViewAnimationOptionBeginFromCurrentState选项的新动画的另一张海报的方法将允许您添加新动画,该动画在新动画开始作为起点的瞬间使用动画状态开始动画对视图的新更改。

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

答案 1 :(得分:0)

就我而言,无法通过调用中断运行中的视图动画

removeAllAnimations

在视图层上。

不过根据此帖子:

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,则会立即发生。