添加延迟动画时,UIView 动画不起作用
Posted
技术标签:
【中文标题】添加延迟动画时,UIView 动画不起作用【英文标题】:UIView animations do not work when a delayed animation is added 【发布时间】:2013-05-23 17:29:30 【问题描述】:我试图移动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 中设置动画(而是直接跳到末尾)。
是否可以使用延迟动画在类似属性上创建动画序列?我需要将其扩展到任意数量的动画,具体取决于用户输入。
【问题讨论】:
【参考方案1】:执行这个动画是一个异步的事情,即给出动画命令,程序流程继续。 此外,如果在前一个命令尚未完成时对视图给出了动画命令,则前一个命令在没有任何动画的情况下完成,并执行新的动画。
我认为您应该将第二个动画代码放在第一个动画的完成块中,您目前正在为此传递 NULL。 completion
在动画执行后执行,我认为此时您希望开始第二个动画。
【讨论】:
前面的命令是动画的,正如你在我添加 alpha 动画时看到的那样。如果第二个动画影响相同的属性,它只是没有动画。另外,正如我所说,我需要能够链接任意数量的动画,具体取决于用户输入。我不能硬核完成块中的序列。 你能详细解释一下你到底想做什么吗?用户的输入是什么,对应的结果应该是什么? 用户将触摸任意数量的区域。提交答案后,会出现一只手,指出他们选择的不适用的领域中他们错过的领域。我有一个解决方案,现在。我今天会发布它。【参考方案2】:我找到了解决方案。在这里。
我添加了一个数组来保存要指向的任意数量的坐标。
@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];
这会按顺序播放动画,直到所有点都被访问过。
【讨论】:
以上是关于添加延迟动画时,UIView 动画不起作用的主要内容,如果未能解决你的问题,请参考以下文章