是否可以在UIView
动画进行过程中取消动画?或者我是否必须降至CA级别?
即我已经完成了这样的事情(也可能设置一个结束动画动作):
[UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:duration]; [UIView setAnimationCurve: UIViewAnimationCurveLinear]; // other animation properties // set view properties [UIView commitAnimations];
但是在动画完成之前我得到动画结束事件,我想取消它(剪短它).这可能吗?谷歌搜索周围发现一些人问同样的问题没有答案 - 一两个人推测它不能完成.
使用:
#import....... [myView.layer removeAllAnimations];
我这样做的方法是为你的终点创建一个新的动画.设置一个非常短的持续时间,并确保使用该+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];
停止最简单的方法都在特定视图动画,立刻,是这样的:
将项目链接到QuartzCore.framework.在代码的开头:
#import
现在,当你想停止视频中的所有动画时,请说:
[CATransaction begin]; [theView.layer removeAllAnimations]; [CATransaction commit];
中间线本身可以工作,但是在runloop完成之前有一段延迟("重绘时刻").要防止该延迟,请将命令包装在显式事务块中,如图所示.这项工作在当前的runloop中没有对该层执行任何其他更改.
在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; } }]; }
要取消动画,您只需在UIView动画之外设置当前正在设置动画的属性.这将停止任何地方的动画,UIView将跳转到您刚刚定义的设置.
很抱歉重新获得此答案,但在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()
注意:如果您不想突然取消,您可以撤消动画,甚至在暂停后更改动画!
如果通过更改常量而不是视图属性来设置约束动画,则其他任何方法都不适用于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]; }
如果你只想平稳地暂停/停止动画
self.yourView.layer.speed = 0;
来源:如何暂停图层树的动画
以上都没有解决它,但这有助于: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) {}];
这应该是一个体面的解决方案.
[UIView setAnimationsEnabled:NO]; // your code here [UIView setAnimationsEnabled:YES];