从 for 循环中调用时看不到 CABasicAnimation

Cannot see a CABasicAnimation when called from within a for loop

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

我很感激任何 advice/comments :)

我认为重复逻辑应该由您使用的动画函数来处理。 如果您使用的是 CAAnimation,则可以使用它的回调 “- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag” 检查是否应该,然后从那里开始一个新的动画。

启动动画时,需要让控制权 return 返回系统才能看到它执行动画。在当今的多线程系统世界中,插入 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"];