touchesBegan:被调用后立即拉动触摸点是否可行?

7
你可能知道,iPhone OS在touchesBegan:发生后会人为延迟约0.25秒。这是为了检查用户是否打算移动屏幕。如果在此期间delta值发生足够显著的变化,则会触发touchesMoved:序列。
但是,当你想在应用程序中实现触觉触摸行为时,你可能不想有任何延迟。它看起来很丑!你开始移动某些东西,然后在0.3秒内什么也不发生。然后,突然整个东西翻转了。每次新的带有移动的触摸序列都会发生这种情况。这真的很糟糕。当然,在某些情况下,这是必需的,因为你可能想确定用户是否真的打算移动。但是对于自定义滑块或其他通过跟踪触摸运动工作的触觉控制来说,这样做并非如此。
因此,当我发现这是iPhone OS故意造成的问题后,我想知道如何解决这个问题。我无法预测移动,因为用户可能向左或向右移动。我在touchesBegan:中不知道这一点。0.3秒恰好足以使应用程序看起来无响应。
然而,似乎还有希望:Convertbot在这方面没有任何问题。旋转轮立即在触摸和移动时开始旋转。没有滞后,没有延迟。我在他们的博客中询问了他们是如何做到的,但还没有回应。
我希望有一种方法可以手动从系统中提取触摸坐标。当touchesBegan:发生时,我会启动一个60Hz的间隔,直到touchesMoved:采取行动。
因此,这个地球上最大的问题是:“这怎么可能?”

我想把这个变成赏金任务,但好像不能做到? - HelloMoon
“砰!”整个东西开始翻转移动!我也在寻找解决方案。 - bobobobo
我们都曾经被这个问题困扰过。我之前问过一个关于这个问题的问题,但是没有意识到touchesMoved事件的延迟导致了我的动画不流畅(我以为是实际的渲染代码)。真正让我生气的是UIScrollView立即获得移动事件-它们非常平滑。 - U62
延迟是由手势识别器添加的,在UIScrollView(以及UITableView)中存在。UIView本身不会延迟任何触摸。 - Costique
它确实可以,并且很容易证明它可以。您可以编写一个UIView子类,在touchesBegan和touchesMoved上执行NSLog并查看日志行的时间戳。在touchesBegan和第一个touchesMoved之间大约有200毫秒的时间差,但通常在后续touchesMoved事件之间只有大约20毫秒的时间差。 - U62
2个回答

4

如果您的响应者在UIScrollView中,请确保将scrollView的delaysContentTouches设置为NO。这适用于UIResponder的touchesBegan:方法和UIControl的beginTrackingWithTouch:方法。


0
如果您的UIView子类是UITableView或其后代之一(例如UITableView)的子视图,则必须将滚动视图或表视图上的delaysContentTouches设置为NO。这样,它将立即将第一个触摸发送到您的touchesBegain:
然而,我认为ConvertBot根本不使用UIScrollView:它可能是一个自定义的UIView,它自己实现了旋转部分。如果您的UI不需要滚动,则只需将您的UIView子类放在内容视图中,您不必设置delaysContentTouches,因为没有滚动视图来拦截触摸事件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接