[Ios] 取消UIView动画?


Answers

使用:

#import <QuartzCore/QuartzCore.h>

.......

[myView.layer removeAllAnimations];
Question

是否有可能在进行中取消UIView动画? 或者我必须下降到CA级别?

即我做了这样的事情(也许设置一个结束动画行动):

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

// set view properties

[UIView commitAnimations];

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




即使您以上述方式取消动画didStopSelector仍然运行。 所以如果你的应用程序由动画驱动的逻辑状态,你将会遇到问题。 由于这个原因,我使用上面描述的方法使用UIView动画的上下文变量。 如果您将程序的当前状态通过上下文参数传递给动画,则当动画停止时, didStopSelector函数可以决定它是应该执行某些操作还是仅基于当前状态和作为上下文传递的状态值进行返回。




在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;
                     }
                 }];
}



如果您通过更改常量而不是视图属性来激活约束,则其他方法都不会在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];
}



[UIView setAnimationsEnabled:NO];
// your code here
[UIView setAnimationsEnabled:YES];






要暂停动画而不将状态恢复为原始或最终状态:

CFTimeInterval paused_time = [myView.layer convertTime:CACurrentMediaTime() fromLayer:nil];
myView.layer.speed = 0.0;
myView.layer.timeOffset = paused_time;