用屏幕点击停止 UIView 动画

Posted

技术标签:

【中文标题】用屏幕点击停止 UIView 动画【英文标题】:Stop UIView animations with screen taps 【发布时间】:2014-11-24 20:37:36 【问题描述】:

我已经启动了一个新的 ios 应用程序,但我的代码有问题。 关于应用程序的描述:在屏幕中间放置了一个圆圈,当我点击屏幕时,圆圈开始移动到我点击那里的点。 我已经对其进行了编程并且它的工作非常好,但是还有一件事:当我点击屏幕上的另一个点时,圆圈会在我点击后立即移动到第二个点! - 即使圆圈仍然移动到第一个点,他会立即开始移动到第二个点。 (这是最难的部分)。

这是我点击屏幕时的代码:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    [self.view.layer removeAllAnimations];

    UITouch *myTouch = [[touches allObjects] objectAtIndex: 0];
    CGPoint currentPos = [myTouch locationInView: self.view];

    [UIView animateWithDuration:2
                              delay:0.0f
                            options:UIViewAnimationCurveEaseInOut | UIViewAnimationOptionRepeat |    UIViewAnimationOptionAutoreverse
                         animations:^()
                             circle.center = CGPointMake(currentPos.x, currentPos.y);
                         
                         completion:^(BOOL finished)];

  

请帮我解决这个问题。也许还有另一种方法可以让那个圆圈或在点击屏幕时动画化。

即使您可以提供代码,当我按下按钮时,圆圈会停止并且不会在我按下按钮时的位置向右移动 - (即使圆圈处于动画状态)所以它会是伟大的.. 谢谢。

【问题讨论】:

【参考方案1】:

据我所知,UIViewAnimation 中没有引用任何值来保存动画的当前中心,因此您需要编写自己的动画算法。

关于“停止圆圈”的问题是圆圈位置没有记录在UIViewAnimation内部我们可以访问的任何地方。为了了解我的意思,请尝试NSLog()circle.center 点,您会看到当您点击屏幕时,circle.center 的值将永远不会改变,直到您移动您在屏幕上点击的位置。 (即使它不断移动,circle.center CGPoint 也不会改变)

这意味着动画几乎立即设置圆心,当动画“停止”时,它不会停止在原处,而是在动画开始时设置圆心时停止。

我知道这不是您想听到的,但要按照您喜欢的方式制作此程序,工作量将超出您的预期。我不熟悉 Core Animation 中的自定义动画,但这里有一些链接可以帮助您入门。

A question similar to yours on another website.

How to find offsets between two points (In your case the starting animation and ending)

您还需要阅读毕达哥拉斯理论和NSTimeInterval,以便计算动画所在的当前位置。

【讨论】:

我想你不明白我的意思,你知道吗?即使您可以提供代码,当我按下按钮时,圆圈就会停止并且不会在我按下按钮时的位置向右移动 - (即使圆圈处于动画状态)所以它会很棒.. @Nir 我理解的方式是您希望圆圈完成动画,直到您可以再次点击以在新位置制作圆圈。对吗? 圆圈只是屏幕上的一个角色/对象,接下来是我的动画动作。 @Nir 我理解那部分。您是否希望圆圈在下一次点击可以注册/动画之前完成动画? 不,圆圈不需要完成第一个动画,他需要立即运行第二个动画..

以上是关于用屏幕点击停止 UIView 动画的主要内容,如果未能解决你的问题,请参考以下文章

动画调整全屏 UIView 的大小以在屏幕底部显示另一个 UIView

Xamarin iOS - 具有速度的 UIView 动画

iOS - UIView 动画的限制?

当用户点击屏幕上的任意位置时调用函数

多个 UIView 的动画与 UIBezierPath

如何在覆盖 UIView 之前停止幻灯片过渡到 Second VC?