使用UIView,animateWithDuration和beginFromCurrentState进行故障

时间:2010-12-18 01:29:22

标签: iphone objective-c uiview core-animation

我有一个自定义视图,必须跟踪用户的位置。我将以下代码放在touchesBegan以及touchesMoved

[UIView animateWithDuration:0.2 delay:0.0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{
    cursorView.center = locationOfTouch;
} completion:^(BOOL finished){}];

对我而言,这似乎相当简单。我希望视图始终为用户的当前位置设置动画,即使该位置已更改且视图仍为动画(因为beginFromCurrentState选项)。

然而,每部动画都完成了。他们没有“过渡”到新动画,没有先完成,然后他们开始新动画。

我尝试在touchesMoved中添加此行:

[cursorView.layer removeAllAnimations];

什么都不做。没有动画被取消。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

使用[cursorView.layer removeAllAnimations];您可以访问视图图层,但您已将动画设置为不是图层而是直接设置视图。
尝试:

[UIView beginAnimations:nil context:NULL]
[UIView setAnimationDuration:0.2];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationCurve:UIViewAnimationCurveLinear];
cursorView.center = locationOfTouch;
[UIView commitAnimations];

并忽略removeAllAnimations,它应该从当前状态转换。

答案 1 :(得分:0)

看起来这是你刚才回答的另一个问题的衍生物,但同样的想法适用。

您无需使用块来执行此操作。只需将您的setCenter包装在UIView动画中即可。像这样:

[UIView beginAnimations:nil context:NULL]
[UIView setAnimationDuration:0.2f];
cursorView.center = locationOfTouch;
[UIView commitAnimations];

请记住,0.2秒非常快。它可能出现以“跳跃”到该位置。要确认,请将持续时间设置为2.0秒,然后查看它是否为动画。

最好的问候。

答案 2 :(得分:0)

从技术上讲,视图应使用默认时间0.25秒自动设置动画。这就是手册所说的,但是,我现在正在这里,因为关于动画的手册似乎不太准确。

此外,beginAnimations调用正在逐步取消,您可能希望使用CATransaction