【问题标题】:iPhone : Best way to detect the end of UIImageView image sequence animationiPhone:检测 UIImageView 图像序列动画结束的最佳方法
【发布时间】:2011-04-15 19:41:33
【问题描述】:

我们知道UIImageView 对图像序列动画有很好的支持。我们可以轻松地创建一个 UIImage 对象数组,设置animationImages 属性,配置动画持续时间,重复次数等,然后触发。但是好像没有办法知道这个动画什么时候结束。

假设我有十张图片,然后我想用它们运行动画(重复计数 = 1)。当动画结束时,我想运行一些其他代码。知道动画已经结束的最佳方法是什么?

我已经明白我可以创建一个NSTimer 并安排它在动画持续时间后触发。但是,如果您需要良好的精度,您真的不能依赖计时器。

所以我的问题是,有没有更好的方法可以知道UIImageView 图像序列动画在不使用计时器的情况下已经结束?

代码是这样的

myImageView.animationImages = 图像; // images 是 UIImages 的 NSArray myImageView.animationDuration = 2.0; myImageView.animationRepeatCount = 1; [myImageView 开始动画]

【问题讨论】:

  • 你真的尝试过使用计时器吗?确实,时间不是 100% 准确的,但 AFAIK 你也不能依赖其他动画的时间。如果内置 UIImageView 动画本身使用计时器,我不会感到惊讶。
  • 你我试过计时器。事实上,这就是我现在正在使用的。这在很多情况下都可以,但是...不是 100% :-)
  • 另外请注意,无论您的目标是什么,-performSelector:withObject:afterDelay 方法可能比一次性调用的计时器更简单。它在内部为你做计时器。

标签: iphone ios objective-c uiimageview


【解决方案1】:

此外,我建议在动画的第一帧设置 UIImageView 的默认图像(属性image),并在启动动画后将其更改为最后一帧(startAnimating 方法)。这样我们就避免了动画完成但没有调用回调时可能发生的丑陋闪烁。

【讨论】:

    【解决方案2】:

    我做了这个(我的 UIImageView 子类的方法)。

    -(void)startAnimatingWithCallback:(UIImageViewAnimationCompletitionBlock) completitionCallback
    {
        [self startAnimating];
    
        dispatch_queue_t animatingQueue = dispatch_get_current_queue();
        dispatch_queue_t pollingQueue = dispatch_queue_create("pollingQueue", NULL);
        dispatch_async(pollingQueue, ^{
    
            while(self.isAnimating) { usleep(10000); }
            dispatch_async(animatingQueue, ^{ if (completitionCallback) completitionCallback(); });
    
        });
    }
    

    简单用法:

    [self.oneView fadeOut];
    [self.otherView startAnimatingWithCallback:^
    {
        [self.oneView fadeIn];
    }];
    

    【讨论】:

    • 最糟糕的黑客攻击之一:while 循环将占用一个 CPU(高达 100%)并迅速耗尽电池电量。
    • 是的,实际上这个“endlessie”循环即使在后台也不是最好的主意。无论如何,这取决于我实际上只使用了几秒钟。
    • 您可以添加usleep(10000); 来缓解问题。否则,您将承担被指责为苹果设备电池问题原因的风险:P
    【解决方案3】:

    UIImageView 上的isAnimating 属性在完成动画后应该转到NO。但是,它不是正式属性,因此您无法对其进行观察。你可以在一个细粒度的计时器上轮询它(比如CADisplayLink's)。

    没有“动画完成”的委托,如果这是你正在寻找的东西。时间可以根据图像的加载延迟等而变化,不,没有确切的方法可以准确地知道何时完成。

    UIImageView 上的图像动画内容很方便,但重量级不足以完成严肃的动画工作。如果您需要这种精度,请考虑自行滚动。

    【讨论】:

    • 是的,我也认为最终我需要自己处理这个问题。只是想确保我没有遗漏任何东西,也没有替代方法。
    • 不确定您所说的“正式财产”是什么意思。这绝对是一个属性,但 UIImageView 可能不会调用 setter(我怀疑没有)。
    猜你喜欢
    • 1970-01-01
    • 2014-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    相关资源
    最近更新 更多