动画后的函数(图像序列)



我到处找过,但没有找到合适的解决方案。我有一个图像序列在启动时播放。在这个序列之后,我想触发一个函数。激活图像的功能。因此,动画将流畅地运行到图像中而不会中断。我在互联网上找到了很多解决方案,例如,用定时器来做,但通过模拟器运行代码,它可以工作,在设备上它不能工作,并且会被延迟:(.这是一个很好的方法来设置定时器吗?方法"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];
}

首先,您应该尝试对performSelectorsetAnimationDurationafterDelay参数使用相同的间隔(例如,两者都使用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:

最新更新