【问题标题】:Stop an auto-reverse / infinite-repeat UIView animation with a BOOL / completion block使用 BOOL / 完成块停止自动反转 / 无限重复 UIView 动画
【发布时间】:2012-12-21 13:55:59
【问题描述】:

我正在设置以下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];
                         }
    }];
}

【问题讨论】:

    标签: ios objective-c core-animation uiviewanimation completion-block


    【解决方案1】:

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

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

    [button.layer removeAllAnimations];
    

    【讨论】:

    • 恐怕不行。应用变换更改后动画仍在进行。 (我将.transform 设置为CGAffineTransformMakeScale(1.0, 1.0))。
    • 我发现了其他可能有用的方法。我更新了我的答案。你可以试试吗?
    • 哦,你自己想出来了 :) 感谢您接受我的回答
    • 当我点击 Add on mine 时,你的出现几乎是一样的,所以我认为这意味着你先输入了它;)
    • @TomvanZummeren 但这会删除每一个动画......如果你有多个动画块并且你只想停止其中一个动画块......
    【解决方案2】:

    旧但另一种选择。

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

    【讨论】:

    • 这是一种比其他解决方案更好的方法,因为它可以平滑地使动画恢复身份。
    【解决方案3】:

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

    【讨论】:

    • 我厌倦了这个,但它对我不起作用。在你的代码中你是从哪里调用这个方法的?
    【解决方案4】:

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

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

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

    【讨论】:

    • 这对我不起作用。我不得不调用 removeAllAnimations。
    猜你喜欢
    • 2023-04-08
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-23
    • 2014-09-16
    相关资源
    最近更新 更多