动画后的功能(图像序列)

时间:2014-04-10 16:59:42

标签: ios animation uiimageview uiimage

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

2 个答案:

答案 0 :(得分:1)

首先,您应尝试对afterDelay参数performSelectorsetAnimationDuration使用相同的时间间隔(例如,两者均为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

答案 1 :(得分:0)