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