iPhone:检测UIImageView图像序列动画结束的最佳方法

时间:2010-09-22 15:39:49

标签: iphone ios objective-c uiimageview

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

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

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

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

代码是这样的

myImageView.animationImages = images; // images is a NSArray of UIImages
myImageView.animationDuration = 2.0;
myImageView.animationRepeatCount = 1;

[myImageView startAnimating]

3 个答案:

答案 0 :(得分:8)

UIImageView上的isAnimating属性在完成动画制作后应转到NO。但这不是一个正式的财产,所以你不能对它进行观察。您可以使用细粒度计时器(例如CADisplayLink)进行轮询。

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

UIImageView上的图像动画是一种方便,而不是重量级足以做严肃的动画工作。如果您需要那种精度,请考虑自己滚动。

答案 1 :(得分:1)

我做了这个(我的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];
}];

答案 2 :(得分:0)

此外,我建议在动画的第一帧上设置UIImageView的默认图像(属性image),并在启动动画(startAnimating方法)后将其更改为最后一帧。通过这种方式,我们可以避免在动画完成但未调用回调时可能出现的丑陋blick。