我有一个动画,它可以在网格上随机移动瓷砖,效果很好。但是,当我在for循环中调用时,您看不到任何动画。我该如何工作?
for (i=0; i<10 ; i++){
// Call animation function
sleep(.5);
}
动画看起来像
CABasicAnimation *move;
[move setFromValue:[NSValue valueWithCGPoint:[button.layer position]]];
CGPoint toLoc = [button.layer position];
// modify toLoc by +/-70px in x/y direction
[move setToValue:[NSValue valueWithCGPoint:toLoc]];
[move setDuration:0.5];
[button.layer setPosition:toLoc];
我感谢任何建议/意见:)
最佳答案
启动动画时,需要让控件返回系统才能看到它执行动画。在当今的多线程系统世界中,插入sleep
几乎从来都不是正确的选择。这肯定是您遇到此问题的原因。
相反,您可以考虑执行以下操作:
for (i=0; i<10 ; i++){
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(i * 0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// Call animation function
});
}
鉴于您的睡眠时间与预期的动画持续时间相同,因此您似乎只是想重复播放动画。相反,请尝试仅添加以下行并删除循环:
[move setRepeatCount:10];
您还需要实例化该对象,然后将动画实际添加到图层中。
CABasicAnimation *move = [[CABasicAnimation alloc] init];
[move setFromValue:[NSValue valueWithCGPoint:[button.layer position]]];
CGPoint toLoc = [button.layer position];
// modify toLoc by +/-70px in x/y direction
[move setToValue:[NSValue valueWithCGPoint:toLoc]];
[move setDuration:0.5];
[move setRepeatCount:10];
[button.layer addAnimation:move forKey:@"position"];