如何取消基于UIView块的动画?


86

我已经搜索了大量SO内容和Apple参考资料,但仍然无法解决我的问题。

是)我有的:

  1. 连接了2UIImageView秒和2UIButton秒的屏幕
  2. 2种动画:
    1. 放大然后缩小每个图像,一个接一个,仅一次 viewDidLoad
    2. 当按下一个按钮时(一个自定义按钮隐藏在每个按钮的“内部” UIImageView),它会触发适当的动画(UIImageView仅一个动画,而不是两个动画)(先放大然后缩小)。
    3. 当我为iOS4 +写作时,我被告知要使用基于块的动画!

我需要的:

如何取消正在播放的动画?除了最后一个我已经设法取消了...:/

这是我的代码段:

[UIImageView animateWithDuration:2.0 
                               delay:0.1 
                             options:UIViewAnimationOptionAllowUserInteraction 
                          animations:^{
        isAnimating = YES;
        self.bigLetter.transform = CGAffineTransformScale(self.bigLetter.transform, 2.0, 2.0);
    } completion:^(BOOL finished){
        if(! finished) return;
        [UIImageView animateWithDuration:2.0 
                                   delay:0.0 
                                 options:UIViewAnimationOptionAllowUserInteraction 
                              animations:^{
            self.bigLetter.transform = CGAffineTransformScale(self.bigLetter.transform, 0.5, 0.5);
        } completion:^(BOOL finished){
            if(! finished) return;
            [UIImageView animateWithDuration:2.0 
                                       delay:0.0 
                                     options:UIViewAnimationOptionAllowUserInteraction 
                                  animations:^{
                self.smallLetter.transform = CGAffineTransformScale(self.smallLetter.transform, 2.0, 2.0);
            } completion:^(BOOL finished){
                if(! finished) return;
                [UIImageView animateWithDuration:2.0 
                                           delay:0.0 
                                         options:UIViewAnimationOptionAllowUserInteraction 
                                      animations:^{
                    self.smallLetter.transform = CGAffineTransformScale(self.smallLetter.transform, 0.5, 0.5);
                }
                                      completion:^(BOOL finished){
                                          if (!finished) return;
                                          //block letter buttons
                                          [self.bigLetterButton setUserInteractionEnabled:YES];
                                          [self.smallLetterButton setUserInteractionEnabled:YES];
                                          //NSLog(@"vieDidLoad animations finished");
                                      }];
            }];
        }];
    }];

莫名其妙smallLetter UIImageView地无法正常工作,因为按下(通过按钮)bigLetter可以正确取消动画...

编辑: 我已经使用了此解决方案,但按比例缩小仍然有问题smallLetter UIImageView-根本不取消... 解决方案

EDIT2:我已经在next / prev方法的开头添加了它:

- (void)stopAnimation:(UIImageView*)source {
    [UIView animateWithDuration:0.01
                          delay:0.0 
                        options:(UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionAllowUserInteraction)
                     animations:^ {
                         source.transform = CGAffineTransformIdentity;
                     }
                     completion:NULL
     ];
}

问题仍然存在...:/不知道如何中断动画链中字母的最后动画


嘿,我认为现在应该接受Hari Kunwar的回答。
marczellm

这些天,您必须使用UIViewPropertyAnimator-这也非常容易。
Fattie

Answers:


151

您可以通过调用以下命令停止视图上的所有动画:

[view.layer removeAllAnimations];

(您需要导入QuartzCore框架以在view.layer上调用方法)。

如果要停止特定的动画而不是所有动画,最好的选择是显式使用CAAnimations而不是UIView动画帮助器方法,那么您将具有更精细的控制,并且可以按名称显式停止动画。

您可以在这里找到Apple Core Animation文档:

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreAnimation_guide/CreatingBasicAnimations/CreatingBasicAnimations.html


10
我只是想添加一下,在调用removeAllAnimations之后,后续的animateWithDuration不再起作用。这是为了进行分页并拖动以刷新控件,也许其他人可能会观察到不同的结果。我最终使用CABasicAnimation并调用[myView.layer removeAnimationForKey:@“ animationKey”];

感谢您的技巧@Nick-仅提示您似乎不再支持该链接,请尝试以下一种方法:developer.apple.com/library/ios/documentation/Cocoa/Conceptual/…–
trdavidson

52

对于iOS 10,请使用UIViewPropertyAnimator进行动画处理。它提供了启动,停止和暂停UIView动画的方法。

 let animator = UIViewPropertyAnimator(duration: 2.0, curve: .easeOut){
        self.view.alpha = 0.0
 }
 // Call this to start animation.
 animator.startAnimation()

 // Call this to stop animation.
 animator.stopAnimation(true)

3

我会在Nick的回答中补充说,使removeAllAnimations顺利实现下一个想法非常方便。

[view.layer removeAllAnimations];
[UIView transitionWithView:self.redView
                  duration:1.0f options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
                      [view.layer displayIfNeeded];
                  } completion:nil];

0

您可以尝试以下操作(在Swift中):

UIView.setAnimationsEnabled(false)
UIView.setAnimationsEnabled(true)

注意:如有必要,您可以在这两个调用之间放置代码,例如:

UIView.setAnimationsEnabled(false)
aview.layer.removeAllAnimations() // remove layer based animations e.g. aview.layer.opacity
UIView.setAnimationsEnabled(true)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.