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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何取消基于UIView块的动画?相关的知识,希望对你有一定的参考价值。

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

我有:

  1. 连接了两个UIImageView和两个UIButton的屏幕
  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仍然存在问题-根本没有取消...solution

EDIT2:

我已在next / prev方法的开头添加了此内容:
- (void)stopAnimation:(UIImageView*)source {
    [UIView animateWithDuration:0.01
                          delay:0.0 
                        options:(UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionAllowUserInteraction)
                     animations:^ {
                         source.transform = CGAffineTransformIdentity;
                     }
                     completion:NULL
     ];
}

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

我已经搜索了大量SO内容和Apple的参考文献,但仍然无法解决我的问题。我所拥有的:具有2个UIImageViews和2个UIButton与其连接的屏幕2种动画:...

答案

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

另一答案

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

另一答案

我想补充一下尼克的回答,使removeAllAnimations顺利实现下一个想法非常方便。

另一答案

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

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

以上是关于如何取消基于UIView块的动画?的主要内容,如果未能解决你的问题,请参考以下文章

重叠 UIView 动画取消第一个完成块

如何为 CALayer 使用基于块的动画?

UIVIew 块动画后用户交互中断

UIView 实现动画

UIView 动画被调用两次,取消动画

如何用动画取消隐藏 UIView