UIView动画会干扰触摸事件

时间:2011-01-02 07:40:26

标签: iphone ipad

我的应用程序包含一个类似于地图的界面,除了展示自动路线之外别无其他。

我有一个彩绘(通过图片)路线,应用程序应该有一个“currentPosition”标记,以便沿着路线自动移动,指示行程进度。

动画效果很好,但是一旦用户触摸屏幕(偶然等等),动画就会完全错位,速度错误,最终会像疯了一样闪烁。

首先,2个代码示例:

    [UIView animateWithDuration:POINT_MOVEMENT_DURATION
                          delay:POINT_MOVEMENT_DELAY
                        options:UIViewAnimationOptionCurveEaseInOut
                     animations:^{
                         self.currentPosition.center = mp.point;
                     }
                     completion:^(BOOL finished){
                         NSLog(@"finished animation: %i", finished); 

                         [self nextPoint:nil];
                     }
     ];

nextPoint是转到下一个点的功能。 mp是一个在屏幕上保持像素坐标的变量。

现在,在运行此代码时,animatin将顺利进行,如日志中所示:

2011-01-02 15:32:11.006 MAP Player[2258:307] finished animation: 1
2011-01-02 15:32:14.008 MAP Player[2258:307] finished animation: 1
2011-01-02 15:32:17.011 MAP Player[2258:307] finished animation: 1

只要我触摸屏幕,就会切换到0

2011-01-02 15:32:26.642 MAP Player[2258:307] finished animation: 0
2011-01-02 15:32:26.647 MAP Player[2258:307] finished animation: 0
2011-01-02 15:32:26.653 MAP Player[2258:307] finished animation: 0

此时,该项目将闪烁/快速移动,方向错误等。

我发现了一件事:在ViewController中,一旦我设置[self.view setUserInteractionEnabled:NO];,闪烁就不会再发生,所以它肯定与用户交互有关。它也独立于SingleTouch / MultiTouch。

如何创建与触摸无关的动画?我想将setUserInteractionEnabled调用添加到动画响应者中。但这似乎不对吗?

2 个答案:

答案 0 :(得分:0)

您可以只保存一个变量,例如'animationStarted',并且在另一个正在进行时不运行动画。

答案 1 :(得分:0)

setUserInteractionEnabled确实是正确的榜样。可能与此相关的是Apple的 MoveMe 示例。他们也在使用setUserInteractionDisabled电话。我认为关键问题是要清楚地了解您的观点所处的位置,运行的动画是什么以及在完成后会发生什么。知道取消/停止动画的正确功能非常有用,它们不会再生成任何事件。

另外对于我的例子,我不得不在界面上添加一个Back按钮,这意味着我也可以以某种方式逃脱控制器。是的,由于自定义用户界面,它不是简单的标准UINavigationController

所以,为了使按钮仍然有效,我不得不将其推到self.view的超级视图:

[self.backButton removeFromSuperview];
[self.view.superview addSubview:self.backButton];

现在我可以享受一个漂亮的动画&没有干扰。但是,等一下,当动画实际运行时,我仍然必须禁用后退按钮的用户交互。这只是因为一旦动画结束,它就会尝试访问一个成员,该成员可能已被dealloc'删除或被删除。我将尝试下次再打电话:

[self.view.layer removeAllAnimations];