我有一个动画,它可以在网格上随机移动瓷砖,效果很好。但是,当我在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"];

07-24 09:36
查看更多