Iphone UIView动画会干扰触摸事件

Iphone UIView动画会干扰触摸事件,iphone,ipad,Iphone,Ipad,我的应用程序由一个类似地图的界面组成,除了显示一条自动路线外,不应该做别的事情 我有一条绘制的(通过图片)路线,应用程序应该有一个“currentPosition”标记,可以沿着路线自动移动,指示旅行进度 动画运行良好,但一旦用户触摸屏幕(意外等),动画就完全错位,速度错误,最终可能会疯狂地闪烁 首先,2个代码示例: [UIView animateWithDuration:POINT_MOVEMENT_DURATION delay:PO

我的应用程序由一个类似地图的界面组成,除了显示一条自动路线外,不应该做别的事情

我有一条绘制的(通过图片)路线,应用程序应该有一个“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]闪烁不会再次发生,因此它肯定与用户交互有关。它也独立于单触/多触


如何创建这些动画?我正在考虑将
setUserInteractionEnabled
调用添加到动画响应程序中。但这似乎不正确?

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

setUserInteractionEnabled
确实是一个正确的示例。可能与此相关的是苹果的MoveMe例子。他们还使用
setUserInteractionDisabled
调用。我认为关键的问题是要清楚地了解你的视图在哪里,什么动画正在运行,如何运行,以及它们完成后会发生什么。了解取消/停止动画的正确功能非常有用,因为它们不会生成更多的事件

此外,对于我的示例,我必须在界面上添加一个后退按钮,这意味着我也可以以某种方式退出控制器。是的,它不是一个简单的标准
UINavigationController
,因为它有定制的用户界面

因此,为了使按钮仍然工作,我必须将其推到
self.view
的superview:

[self.backButton removeFromSuperview];
[self.view.superview addSubview:self.backButton];
现在我可以享受一个很好的动画&没有干扰。但请稍候,当动画实际运行时,我仍然必须禁用backbutton的用户交互。这仅仅是因为一旦动画完成,它会尝试访问一个成员,该成员当时可能已被
dealloc
'd或删除。下次我可能会打电话给你:

[self.view.layer removeAllAnimations];

您是否表示,当触摸屏幕时&动画正在运行,动画实际上正在重新启动?不,动画仅启动,但您和它看起来您正在启动第二个动画,而第一个动画尚未完成。但是,也许我错了。我仔细检查了一下——这不是问题所在。我想如果发现了问题,我会做更多的检查并回答问题。是关于干扰。