我有一个实例方法,它将永远在其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?
}
});
}
答案 0 :(得分:0)
不,你不能这样做。睡眠将阻止动画启动,因为它会阻止主线程。而且你无法在后台线程上运行动画。
您要做的是将自己设置为动画的委托并添加完成方法。然后在完成方法中触发下一个动画。
我在这里写了一篇关于SO的文章解释了如何在动画中添加完成块并在动画结束时触发它。查看this link.