26

我正在设置以下UIView animateWithDuration:方法,目的是animationOn在程序的其他地方设置我的 BOOL 以取消无限循环重复。我的印象是completion每次动画循环结束时都会调用该块,但情况似乎并非如此。

completion是否曾在重复动画中调用过该块?如果没有,有没有另一种方法可以从这个方法之外停止这个动画?

- (void) animateFirst: (UIButton *) button
{
    button.transform = CGAffineTransformMakeScale(1.1, 1.1);
    [UIView animateWithDuration: 0.4
                          delay: 0.0
                        options: UIViewAnimationOptionCurveEaseOut | UIViewAnimationOptionAutoreverse | UIViewAnimationOptionRepeat
                     animations: ^{
                         button.transform = CGAffineTransformIdentity;
                     } completion: ^(BOOL finished){
                         if (!animationOn) {
                             [UIView setAnimationRepeatCount: 0];
                         }
    }];
}
4

4 回答 4

54

只有在动画中断时才会调用完成块。例如,当应用程序进入后台并再次返回前台(通过多任务处理)时,它会被调用。在这种情况下,动画将停止。发生这种情况时,您应该重新启动动画。

要停止动画,您可以将其从视图层中移除:

[button.layer removeAllAnimations];
于 2012-12-21T13:59:25.357 回答
9

旧但另一种选择。

您还可以设置另一个不在同一视图上重复的动画,这样您还可以在当前状态下捕获它并使用选项 UIViewAnimationOptionBeginFromCurrentState 将其返回到原来的状态。您的完成块也被调用。

-(void)someEventSoStop
{
    button.transform = CGAffineTransformMakeScale(1.0, 1.0);
    [UIView animateWithDuration: 0.4
                          delay: 0.0
                        options: UIViewAnimationOptionCurveEaseOut | UIViewAnimationOptionBeginFromCurrentState
                     animations: ^{
                         button.transform = CGAffineTransformIdentity;
                     } completion: ^(BOOL finished){

                     }];
}
于 2015-02-26T12:07:09.560 回答
2

我已经通过调用解决了这个问题[button.layer removeAllAnimations]

于 2012-12-21T14:11:03.513 回答
1

根据 View 类参考的文档:如果您使用了任何类方法,例如animateWithDuration:delay:options:animations:completion: 如果持续时间设置为负值或 0,则在不执行动画的情况下进行更改。所以我做了这样的事情来停止无限动画:

[UIView animateWithDuration:0.0 animations:^{
      button.layer.affineTransform = CGAffineTransformIdentity;
  }];

我认为这比建议的答案中从图层中删除所有动画要好。请注意,这适用于 UIView 类中的所有其他类动画方法。

于 2016-01-21T19:28:08.063 回答