告诉子程序CAAnimation已经完成

时间:2014-01-12 03:59:16

标签: ios iphone

我有一个实例方法,它将永远在其shadowOpacity属性上执行UIView的动画(永不停止)。

所以我只是将动画代码放入while循环中。但问题是,在上一个动画完成之前,子程序循环无法启动。

这里我只做一个简单的sleep(0.5)系统调用。它当然留下了一些显示问题。

我的问题是如何在这里实现NO-TIME-GAP重复动画?

- (void)animateShadowRepeatly  
{
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"shadowOpacity"];
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        while (YES) {
            dispatch_sync(dispatch_get_main_queue(), ^{
                animation.duration = 0.5;
                if (_actionTarget2.layer.shadowOpacity <= 0.1) {
                    animation.fromValue = [NSNumber numberWithFloat:0.0];
                    animation.toValue = [NSNumber numberWithFloat:1.0];
                    _actionTarget2.layer.shadowOpacity = 1.0;
                } else {
                    animation.fromValue = [NSNumber numberWithFloat:1.0];
                    animation.toValue = [NSNumber numberWithFloat:0.0];
                    _actionTarget2.layer.shadowOpacity = 0.0;
                }
                [_actionTarget2.layer addAnimation:animation forKey:@"shadowOpacity"];
            });
            sleep(0.5);//here I must pasuse the while loop until animation on actionTarget2 finished.I think sleep(0.5) here is not a good implement,How to make an elegant implement for the dependency on animation purpose?
         }
    });
}

1 个答案:

答案 0 :(得分:0)

不,你不能这样做。睡眠将阻止动画启动,因为它会阻止主线程。而且你无法在后台线程上运行动画。

您要做的是将自己设置为动画的委托并添加完成方法。然后在完成方法中触发下一个动画。

我在这里写了一篇关于SO的文章解释了如何在动画中添加完成块并在动画结束时触发它。查看this link.