【问题标题】:Pausing an animation in iOS (objective C)在 iOS 中暂停动画(目标 C)
【发布时间】:2019-06-13 09:50:08
【问题描述】:

我在一些客观的 C 代码中处理动画时遇到了一些问题。

首先,相关代码如下:

BOOL pauseFlag; // Instance variable.
CGFloat animationDuration,pauseDuration; // Instance variables.
......
pauseFlag = NO;
animationDuration = 1.0;
pauseDuration = 1.0;

- (void)animationFunction
{
    [UIView animateWithDuration:animationDuration
                          delay:pauseFlag?pauseDuration:0
                        options:UIViewAnimationOptionBeginFromCurrentState
                     animations:^{
                        ......
                     }
                     completion:^(BOOL finished){
                        ......
                        pauseFlag = Some_New_Value;
                        [self animationFunction];
                     }];
}

那么问题来了:

pauseFlagYES 时应该发生的延迟没有发生。 当然,在写这篇文章之前,我已经尝试了各种我想到的解决方案,比如更改选项,我还检查了在输入 animationFunction pauseFlag 时是否有值 YES。但在所有情况下,延迟都被忽略了。

我做错了什么?我需要在我的动画中插入一个暂停,并认为这是最简单的方法。 有人有想法吗?

仅供参考,除了这个问题。此动画代码运行良好。

【问题讨论】:

  • 这只是一个建议,您是否尝试过延迟硬编码值?
  • 是的,我已经测试过了;在这种情况下,延迟按预期工作。但我只需要它在某些情况下出现,而不是总是出现。那是我的问题。
  • @Michel 你如何设置pauseFlag 的值?
  • pauseFlag=YES;或 pauseFlag=NO;换句话说,没什么特别的。
  • 问题应该是 pauseFlag = Some_New_Value 或 delay:pauseFlag?pauseDuration:0 在 animationFunction() 中取另一个 bool 并打印它,因为我试过你的代码没问题,可能有小事你失踪了。

标签: ios objective-c animation uiviewanimation


【解决方案1】:

尝试使用UIViewPropertyAnimator 为您的视图设置动画:

UIViewPropertyAnimator* animator = [UIViewPropertyAnimator runningPropertyAnimatorWithDuration:animationDuration
                                                                                         delay:pauseFlag?pauseDuration:0
                                                                                       options:UIViewAnimationOptionBeginFromCurrentState
                                                                                    animations:^{
                                                                                        ......       
                                                                                    }
                                                                                    completion:^(UIViewAnimatingPosition finalPosition) {
                                                                                        ......
                                                                                        pauseFlag = Some_New_Value;
                                                                                        [self animationFunction];                                                 
                                                                                    }];

如果要暂停动画调用pauseAnimation

[animator pauseAnimation];

要恢复它,请致电startAnimation:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    [animator startAnimation];
});

本文中的所有代码均在 Xcode 10.2.1 中测试。

【讨论】:

  • 这听起来很有趣,谢谢。但是您建议的这种方法(pauseAnimation)似乎没有参数可以让我设置暂停的长度。这是个大问题。
  • @Michel 我更新了我的答案。尝试延迟拨打startAnimation
  • 好的。我也刚刚在网上找到了另一个我也想尝试的想法:stackoverflow.com/questions/21547241/…
  • 我终于在 dispatch_after(dispatch_time(DISPATCH_TIME_NOW,...., ^{...}); 中使用了你的想法,但没有使用 [animator pauseAnimation]; 它按我想要的方式工作。谢谢给你!Спасибо。
  • 动画是通过调用一个函数来启动的,该函数又启动动画。我使用 dispatch_after(dispatch_time(... 让它在调用这个函数之前等待足够的时间(实际上这个函数实际上是递归调用自己)
猜你喜欢
  • 2019-10-02
  • 1970-01-01
  • 2011-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多