我到处找过,但没有找到合适的解决方案。我有一个图像序列在启动时播放。在这个序列之后,我想触发一个函数。激活图像的功能。因此,动画将流畅地运行到图像中而不会中断。我在互联网上找到了很多解决方案,例如,用定时器来做,但通过模拟器运行代码,它可以工作,在设备上它不能工作,并且会被延迟:(.这是一个很好的方法来设置定时器吗?方法"animationDone"总是在错误的时间触发!
这里是我的示例代码:
- (void)viewDidLoad {
imageView.animationImages = [NSArray arrayWithObjects:
[UIImage imageNamed:@"Rad_start_00000.png"],
[UIImage imageNamed:@"Rad_start_00001.png"],
[UIImage imageNamed:@"Rad_start_00002.png"],
[UIImage imageNamed:@"Rad_start_00003.png"],
[UIImage imageNamed:@"Rad_start_00004.png"],
[UIImage imageNamed:@"Rad_start_00005.png"],
[UIImage imageNamed:@"Rad_start_00006.png"],
[UIImage imageNamed:@"Rad_start_00007.png"],
[UIImage imageNamed:@"Rad_start_00008.png"],
[UIImage imageNamed:@"Rad_start_00009.png"],
[UIImage imageNamed:@"Rad_start_00010.png"],
[UIImage imageNamed:@"Rad_start_00011.png"],
[UIImage imageNamed:@"Rad_start_00012.png"],
[UIImage imageNamed:@"Rad_start_00013.png"],
[UIImage imageNamed:@"Rad_start_00014.png"],
[UIImage imageNamed:@"Rad_start_00015.png"],
[UIImage imageNamed:@"Rad_start_00016.png"],
[UIImage imageNamed:@"Rad_start_00017.png"],nil];
[imageView setAnimationDuration:0.7];
[imageView setAnimationRepeatCount:1];
[imageView startAnimating];
[self performSelector:@selector(animationDone) withObject:nil afterDelay:1.2];
}
首先,您应该尝试对performSelector
和setAnimationDuration
的afterDelay
参数使用相同的间隔(例如,两者都使用0.7秒)。
如果这不能完全达到您想要的效果,您可以通过编程调用计时器,不断检查动画是否完成。例如,您可以设置一个显示链接(它就像一个计时器,但链接到显示的更新),并检查imageView.isAnimating
,例如:
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@property (nonatomic, strong) CADisplayLink *displayLink;
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.imageView.animationImages = @[[UIImage imageNamed:@"Rad_start_00000.png"],
[UIImage imageNamed:@"Rad_start_00001.png"],
[UIImage imageNamed:@"Rad_start_00002.png"],
[UIImage imageNamed:@"Rad_start_00003.png"],
[UIImage imageNamed:@"Rad_start_00004.png"],
[UIImage imageNamed:@"Rad_start_00005.png"],
[UIImage imageNamed:@"Rad_start_00006.png"],
[UIImage imageNamed:@"Rad_start_00007.png"],
[UIImage imageNamed:@"Rad_start_00008.png"],
[UIImage imageNamed:@"Rad_start_00009.png"],
[UIImage imageNamed:@"Rad_start_00010.png"],
[UIImage imageNamed:@"Rad_start_00011.png"],
[UIImage imageNamed:@"Rad_start_00012.png"],
[UIImage imageNamed:@"Rad_start_00013.png"],
[UIImage imageNamed:@"Rad_start_00014.png"],
[UIImage imageNamed:@"Rad_start_00015.png"],
[UIImage imageNamed:@"Rad_start_00016.png"],
[UIImage imageNamed:@"Rad_start_00017.png"]];
[self.imageView setAnimationDuration:0.7];
[self.imageView setAnimationRepeatCount:1];
[self.imageView startAnimating];
[self startDisplayLink];
}
- (void)startDisplayLink
{
self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(handleDisplayLink:)];
[self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
}
- (void)stopDisplayLink
{
[self.displayLink invalidate];
self.displayLink = nil;
}
- (void)handleDisplayLink:(CADisplayLink *)displayLink
{
if (!self.imageView.isAnimating) {
[self stopDisplayLink];
NSLog(@"done");
// do whatever else you want here
}
}
@end
尝试使用动画的委托和setAnimationDidStopSelector:
https://developer.apple.com/library/ios/documentation/uikit/reference/UIView_Class/UIView/UIView.html#//apple_ref/occ/clm/UIView/setAnimationDelegate: