我们知道UIImageView
对图像序列动画有很好的支持。我们可以轻松创建一个UIImage对象数组,设置animationImages
属性,配置动画持续时间,重复计数等,然后激发。但似乎没有办法知道这个动画何时结束。
假设我有十个图像,然后我想用它们运行动画(重复计数= 1)。当动画结束时,我想运行一些其他代码。知道动画结束的最佳方法是什么?
我已经明白我可以创建一个NSTimer
并安排它在动画持续时间后触发。但是如果你需要很好的精度,你真的不能依赖计时器。
所以我的问题是,有没有更好的方法来知道UIImageView
图像序列动画已经结束而不使用计时器?
代码是这样的
myImageView.animationImages = images; // images is a NSArray of UIImages myImageView.animationDuration = 2.0; myImageView.animationRepeatCount = 1; [myImageView startAnimating]
答案 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。