当前位置:  开发笔记 > 编程语言 > 正文

取消UIView动画?

如何解决《取消UIView动画?》经验,为你挑选了10个好方法。

是否可以在UIView动画进行过程中取消动画?或者我是否必须降至CA级别?

即我已经完成了这样的事情(也可能设置一个结束动画动作):

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:duration];
[UIView setAnimationCurve: UIViewAnimationCurveLinear];
// other animation properties

// set view properties

[UIView commitAnimations];

但是在动画完成之前我得到动画结束事件,我想取消它(剪短它).这可能吗?谷歌搜索周围发现一些人问同样的问题没有答案 - 一两个人推测它不能完成.



1> Jim Heising..:

使用:

#import 

.......

[myView.layer removeAllAnimations];


我发现我必须添加__#import __来删除编译器警告;)
我发现调用this触发完成:^(BOOL完成)块如果使用+(void)animateWithDuration:(NSTimeInterval)持续时间动画:(void(^)(void))动画完成:(void(^)(BOOL完成) )完成
这么简单,但很难找到.谢谢你,我花了一个小时试图解决这个问题.
这个解决方案可能存在的问题是(至少在iOS 5中)在它生效之前有一个延迟 - 如果你的意思是"现在停止动画,那么它在我继续下一行之前就不会很快起作用"码".

2> Stephen Darl..:

我这样做的方法是为你的终点创建一个新的动画.设置一个非常短的持续时间,并确保使用该+setAnimationBeginsFromCurrentState:方法从当前状态开始.将其设置为YES时,将缩短当前动画.看起来像这样:

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:0.1];
[UIView setAnimationCurve: UIViewAnimationCurveLinear];
// other animation properties

// set view properties

[UIView commitAnimations];


在iOS4 +中,使用animateWithDuration上的UIViewAnimationOptionBeginFromCurrentState选项:delay:options:animations:completion:

3> matt..:

停止最简单的方法在特定视图动画,立刻,是这样的:

将项目链接到QuartzCore.framework.在代码的开头:

#import 

现在,当你想停止视频中的所有动画时,请说:

[CATransaction begin];
[theView.layer removeAllAnimations];
[CATransaction commit];

中间线本身可以工作,但是在runloop完成之前有一段延迟("重绘时刻").要防止该延迟,请将命令包装在显式事务块中,如图所示.这项工作在当前的runloop中没有对该层执行任何其他更改.


`removeAllAnimations`会产生将动画带到最终帧的副作用,而不是将它停在现在的位置.
通常,当人们希望动画停止时,他们希望它停在当前帧 - 不是第一帧也不是最后一帧.跳到第一帧或最后一帧看起来像生涩的动作.
在您的代码运行良好后,我一直在使用[CATransaction flush],有时会导致它不立即写入.但是,有一个0.1秒的性能问题,例如它在特定时间滞后.任何解决方法?

4> Ville Laurik..:

在iOS 4及更高版本上,使用UIViewAnimationOptionBeginFromCurrentState第二个动画上选项剪切第一个动画短片.

例如,假设您有一个带有活动指示符的视图.您希望淡入活动指示器,同时开始一些可能耗时的活动,并在活动结束时将其淡出.在下面的代码中,调用带有活动指示器的视图activityView.

- (void)showActivityIndicator {
    activityView.alpha = 0.0;
    activityView.hidden = NO;
    [UIView animateWithDuration:0.5
                 animations:^(void) {
                     activityView.alpha = 1.0;
                 }];

- (void)hideActivityIndicator {
    [UIView animateWithDuration:0.5
                 delay:0 options:UIViewAnimationOptionBeginFromCurrentState
                 animations:^(void) {
                     activityView.alpha = 0.0;
                 }
                 completion:^(BOOL completed) {
                     if (completed) {
                         activityView.hidden = YES;
                     }
                 }];
}



5> tomtaylor..:

要取消动画,您只需在UIView动画之外设置当前正在设置动画的属性.这将停止任何地方的动画,UIView将跳转到您刚刚定义的设置.


这就是`-animationDidStop中的'完成'参数:finished:context:`是for.如果`[finished boolValue] == NO`,那么你知道你的动画被某种方式取消了.
这只是部分正确.它确实会停止动画,但它不会阻止它触发委托方法,最明显的是animationComplete处理程序,所以如果你有逻辑,你会看到问题.

6> Tiago Almeid..:

很抱歉重新获得此答案,但在iOS 10中有些事情发生了变化,现在取消是可能的,您甚至可以优雅地取消!

在iOS 10之后,您可以使用UIViewPropertyAnimator取消动画!

UIViewPropertyAnimator(duration: 2, dampingRatio: 0.4, animations: {
    view.backgroundColor = .blue
})
animator.stopAnimation(true)

如果传递true,则取消动画,并在取消动画的位置停止.不会调用完成方法.但是,如果您传递false,则您负责完成动画:

animator.finishAnimation(.start)

您可以完成动画并保持当前状态(.current)或进入初始状态(.start)或结束状态(.end)

顺便说一句,你甚至可以暂停并重启.​​.....

animator.pauseAnimation()
animator.startAnimation()

注意:如果您不想突然取消,您可以撤消动画,甚至在暂停后更改动画!



7> Nikola Lajic..:

如果通过更改常量而不是视图属性来设置约束动画,则其他任何方法都不适用于iOS 8.

示例动画:

self.constraint.constant = 0;
[self.view updateConstraintsIfNeeded];
[self.view layoutIfNeeded];
[UIView animateWithDuration:1.0f
                      delay:0.0f
                    options:UIViewAnimationOptionCurveLinear
                 animations:^{
                     self.constraint.constant = 1.0f;
                     [self.view layoutIfNeeded];
                 } completion:^(BOOL finished) {

                 }];

解:

您需要从受约束更改及其子图层影响的任何视图的图层中删除动画.

[self.constraintView.layer removeAllAnimations];
for (CALayer *l in self.constraintView.layer.sublayers)
{
    [l removeAllAnimations];
}



8> Victor..:

如果你只想平稳地暂停/停止动画

self.yourView.layer.speed = 0;

来源:如何暂停图层树的动画



9> 小智..:

以上都没有解决它,但这有助于:UIView动画立即设置属性,然后动画它.当表示层与模型(set属性)匹配时,它会停止动画.

我解决了我的问题,即"我想从你看起来像你出现的地方动画"('你'意思是视图).如果你想要那么,那么:

    添加QuartzCore.

    CALayer * pLayer = theView.layer.presentationLayer;

将位置设置为表示层

我使用了一些选项,包括 UIViewAnimationOptionOverrideInheritedDuration

但由于Apple的文档含糊不清,我不知道它在使用时是否真的会覆盖其他动画,或者只是重置定时器.

[UIView animateWithDuration:blah... 
                    options: UIViewAnimationOptionBeginFromCurrentState ... 
                    animations: ^ {
                                   theView.center = CGPointMake( pLayer.position.x + YOUR_ANIMATION_OFFSET, pLayer.position.y + ANOTHER_ANIMATION_OFFSET);
                   //this only works for translating, but you get the idea if you wanna flip and scale it. 
                   } completion: ^(BOOL complete) {}];

这应该是一个体面的解决方案.



10> ideawu..:
[UIView setAnimationsEnabled:NO];
// your code here
[UIView setAnimationsEnabled:YES];

推荐阅读
罗文彬2502852027
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有