Ios 使用布尔/完成块停止自动反转/无限重复UIView动画

Ios 使用布尔/完成块停止自动反转/无限重复UIView动画,ios,objective-c,core-animation,uiviewanimation,completion-block,Ios,Objective C,Core Animation,Uiviewanimation,Completion Block,我正在设置以下UIView animateWithDuration:方法,目的是在程序的其他地方设置我的animationOnBOOL来取消无限循环重复。我的印象是,每次动画循环结束时都会调用completion块,但情况似乎并非如此 重复动画中是否调用过完成块?如果没有,有没有其他方法可以从这个方法之外阻止这个动画 - (void) animateFirst: (UIButton *) button { button.transform = CGAffineTransformMakeS

我正在设置以下
UIView animateWithDuration:
方法,目的是在程序的其他地方设置我的
animationOn
BOOL来取消无限循环重复。我的印象是,每次动画循环结束时都会调用
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];
                         }
    }];
}

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

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

[button.layer removeAllAnimations];

我通过调用
[button.layer removeAllAnimations]

旧的但另一个选项解决了这个问题

您还可以设置另一个不在同一视图上重复的动画,这样您也可以在当前状态下捕获该动画,并使用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){

                     }];
}

根据View类引用的文档:如果您使用了任何类方法,例如 如果持续时间设置为负值或0,则在不执行动画的情况下进行更改。 所以我做了一些类似的事情来阻止无限动画:

[UIView animateWithDuration:0.0 animations:^{
      button.layer.affineTransform = CGAffineTransformIdentity;
  }];
我认为这比按照建议的答案从层中删除所有动画要好。
请注意,这适用于UIView类中的所有其他类动画方法。

恐怕这不起作用。应用变换中的更改后,动画仍在继续。(我将
.transform
设置为
CGAffineTransformMakeScale(1.0,1.0)
)。我发现了其他可能有效的方法。我更新了我的答案。你能试试吗?哦,你自己想出来的:)谢谢你接受了我的答案。你的答案在我点击我的“添加”时出现了,所以我想这意味着你是先输入的;)@但这将删除每一个动画。。。。如果你有多个动画块,你只想停止其中一个动画块…我累了,但它不适合我。在你的代码中,你从哪里调用这个方法?这是一个比其他解决方案更好的方法,因为它可以顺利地将动画恢复到身份。这对我不起作用。我不得不打电话给removeAllAnimations。