我试图移动UILabel
两次,但我的行为很奇怪。这是我的第一部动画:
- (IBAction)doAnimation:(id)sender
{
CGRect labelFrame = self.label.frame;
CGRect newFrame = CGRectMake((random() / (float)RAND_MAX) * self.view.frame.size.width,
(random() / (float)RAND_MAX) * self.view.frame.size.height,
labelFrame.size.width,
labelFrame.size.height);
[UIView animateWithDuration:2
delay:0
options:0
animations:^{
self.label.frame = newFrame;
}
completion:NULL];
}
这完美无缺。标签在移动到位时会逐渐消失。
然后我通过在doAnimation:
CGRect newFrame2 = CGRectMake((random() / (float)RAND_MAX) * self.view.frame.size.width,
(random() / (float)RAND_MAX) * self.view.frame.size.height,
labelFrame.size.width,
labelFrame.size.height);
[UIView animateWithDuration:2
delay:3
options:0
animations:^{
self.label.frame = newFrame2;
}
completion:NULL];
在这种情况下,我得到了不同的行为。标签跳转到第一个动画的结尾,等待延迟,然后动画第二个动作。
出于好奇,我尝试在动画1中动画两个属性。
animations:^{
self.label.frame = newFrame;
self.label.alpha = 1.0f;
}
alpha动画正确,但帧更改没有。
如果我在动画2中添加了alpha更改,那么alpha不会在动画1中设置动画(而只是跳转到结尾)。
是否可以使用延迟动画在类似属性上创建动画序列?我需要将其扩展为任意数量的动画,具体取决于用户输入。
答案 0 :(得分:0)
执行此动画是异步的,即给出动画命令,程序流程继续 此外,如果在前一个命令尚未完成时为视图给出动画命令,则完成上一个命令而不进行任何动画并执行新动画。
我认为你应该把第二个动画代码放在第一个动画的完成块中,你当前正在为它传递NULL。 completion
在执行动画后执行,此时你想开始我的第二个动画。
答案 1 :(得分:0)
我找到了解决方案。在这里。
我添加了一个数组来保存任意数量的坐标以指向。
@property (nonatomic, retain) NSMutableArray* animationCoordinates;
然后我在启动动画序列之前将视图添加到数组中。
我还添加了一种方法来启动下一个动画。
- (void)playNextAnimation
{
if (self.animationCoordinates.count > 0)
{
CGPoint point = [[self.animationCoordinates objectAtIndex:0] CGPointValue];
CGRect labelFrame = self.label.frame;
CGRect newFrame = CGRectMake(point.x,
point.y,
self.originalHandFrame.size.width,
self.originalHandFrame.size.height);
[self animateWithDuration:2.0
delay:0.0
animations:^{
self.label.frame = newFrame;
self.label.alpha = 1.0f;
}
completion:^(BOOL success){
[self playNextAnimation];
}];
[self.buttonsToAnimate removeObjectAtIndex:0];
}
}
当我想开始制作动画时,我只需要打电话
[self playNextAnimation];
按顺序播放动画,直到所有点都被访问过。