我们在 AppStore Bust~A~Spook中有一个应用程序,我们遇到了问题。当您点击屏幕时,我们使用 CALayer 在动画期间查找所有视图的位置,如果您点击其中一个,我们将启动一个骰子序列。但是,有一个明显的延迟,看起来好像触摸被缓冲了,我们收到事件的时间很晚。有没有办法轮询或任何更好的方法来响应触摸以避免这种滞后时间?
这是在 UIView 而不是 UIScrollView
我们在 AppStore Bust~A~Spook中有一个应用程序,我们遇到了问题。当您点击屏幕时,我们使用 CALayer 在动画期间查找所有视图的位置,如果您点击其中一个,我们将启动一个骰子序列。但是,有一个明显的延迟,看起来好像触摸被缓冲了,我们收到事件的时间很晚。有没有办法轮询或任何更好的方法来响应触摸以避免这种滞后时间?
这是在 UIView 而不是 UIScrollView
您是否使用 UIScrollView 来托管所有这些?有一个称为 delaysContentTouches 的属性。这默认为 YES,这意味着视图在传递之前尝试确定触摸是否是滚动手势。您可以尝试将其设置为 NO 并查看是否有帮助。
这是一篇关于季节性应用程序的相当老的帖子,所以 OP 可能还没有解决这个问题,但以防其他人遇到同样的问题并发现这很有用。
我同意 Kriem 的观点,即 CPU 过载是触摸处理显着延迟的一个常见原因,尽管在不得不退出 OpenGL 之前可以进行很多优化。CALayer 针对您在此处描述的各种问题进行了很好的优化。
我们应该首先检查基础知识:
layer
touchesBegan:withEvent:
在主视图中实现UITouchPhaseBegan
时,您调用hitTest:
主视图layer
以找到适当的子层然后,我们可以使用 Instruments 来检查性能。确保您的 CPU 没有过载。模拟器中的一切都运行良好但在设备上是否有问题?
您尝试解决的问题非常普遍,因此您不应期望需要复杂或棘手的解决方案。设计或实现很可能存在基本缺陷,只需要进行故障排除。
延迟触摸通常表示 CPU 过载。使用 NSTimer 进行基于帧到帧的操作很容易干扰触摸处理。
如果您的应用程序是这种情况,那么我的建议很简单:OpenGL。
如果您在进行CALayer
命中测试的同时对 s 进行任何类型的核心动画动画,则必须presentationLayer
在调用之前获取hitTest:
,因为模型层的位置不会反映屏幕上可能出现的内容,但是图层动画的位置。
希望有帮助。