2010-12-18 105 views
2

我有一个自定义视图,必须跟踪用户的位置。我把下面的代码touchesBegan,以及在touchesMoved与UIView,animateWithDuration和beginFromCurrentState的故障

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

这似乎相当简单给我。我期望视图始终对用户的当前位置进行动画处理,即使该位置已更改且视图仍然具有动画效果(由于beginFromCurrentState选项)。

然而,每个动画完全完成。他们不会“过渡”到新的动画,不是他们先完成,然后开始新的动画。

我尝试添加在touchesMoved这行:

[cursorView.layer removeAllAnimations]; 

没有做任何事情。没有动画被取消。有任何想法吗?

+0

有没有要与一个动画来做到这一点的理由,而不是每次touchesMoved是刚刚设置中心叫什么名字? – 2010-12-18 07:28:15

+0

是的;我不希望视图“跳”到触摸的位置。我希望它能顺利地将它制作成动画。 – Rits 2010-12-19 16:45:24

回答

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,它应该从当前状态转换。

+0

没有一种方法可以使用iOS 4块的方法吗?我认为苹果建议不要使用'beginAnimations:context:'自iOS 4以来? – Rits 2011-01-03 18:23:24

+0

我以为相同,但即使语法突出显示“UIViewAnimationOptionBeginFromCurrentState”不适用于我,所以我决定只使用块而不是来自CurrentState的简单动画。 (如果您决定在iOS4之前支持旧版本,则必须使用此方法) – 2011-01-03 18:26:07

+0

好的,我会尽快完成此尝试。 – Rits 2011-01-03 18:27:12

0

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

你不需要使用块来做到这一点。只需将您的setCenter包装在UIView动画中即可。像这样:

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

请记住,0.2秒是非常快的。它可能出现“跳”到位置。要确认,请将持续时间设置为2.0秒,看看它是否具有动画效果。

此致敬礼。

0

从技术上讲,视图应该自动生成动画,默认时间为0.25秒。这就是手册所说的,但是,我现在在这里,因为这些手册在动画方面似乎不太准确。

此外,beginAnimations呼叫被淘汰,你可能想使用一个CATransaction代替