Iphone UIView动画会干扰触摸事件
我的应用程序由一个类似地图的界面组成,除了显示一条自动路线外,不应该做别的事情 我有一条绘制的(通过图片)路线,应用程序应该有一个“currentPosition”标记,可以沿着路线自动移动,指示旅行进度 动画运行良好,但一旦用户触摸屏幕(意外等),动画就完全错位,速度错误,最终可能会疯狂地闪烁 首先,2个代码示例:Iphone UIView动画会干扰触摸事件,iphone,ipad,Iphone,Ipad,我的应用程序由一个类似地图的界面组成,除了显示一条自动路线外,不应该做别的事情 我有一条绘制的(通过图片)路线,应用程序应该有一个“currentPosition”标记,可以沿着路线自动移动,指示旅行进度 动画运行良好,但一旦用户触摸屏幕(意外等),动画就完全错位,速度错误,最终可能会疯狂地闪烁 首先,2个代码示例: [UIView animateWithDuration:POINT_MOVEMENT_DURATION delay:PO
[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];
您是否表示,当触摸屏幕时&动画正在运行,动画实际上正在重新启动?不,动画仅启动,但您和它看起来您正在启动第二个动画,而第一个动画尚未完成。但是,也许我错了。我仔细检查了一下——这不是问题所在。我想如果发现了问题,我会做更多的检查并回答问题。是关于干扰。