0

更新:真的很简单,就像在使用触摸时不为 UI 元素设置动画一样简单。它现在完美地跟随触摸,没有滞后。

我目前正在尝试通过在 UIView 子类中实现 CALayer 子类来实现 UI 功能。我在自定义 UIVIew 的相应视图控制器中接收到触摸事件,通知 UIView 有关触摸,然后通知 CALayer 以便为在图层中绘制的 UI 元素设置动画。

这一切都有效,但我注意到当运动中有很大的增量时(如快速滚动手指时),CABasicAnimation 会落后。理想情况下,我希望动画与用户的手指完美对齐。

我想出了一种将动画的速度设置为任意高的hacky方法,如

anim.speed = 10.0f;

这基本上跟上了用户的手指,但我觉得这是一个完全的黑客攻击,而不是一个可交付的解决方案。为了解决这个问题,我是否应该人为地限制处理多少触摸事件?我应该对我不知道的动画的速度/持续时间进行某种计算吗?

感谢您对此的任何帮助!

4

1 回答 1

0

在连续手势期间,不应为动作设置动画,而应直接移动到手势的位置。当手势完成时,如果您希望它固定在其他位置,则为最终的、手势后的目的地设置动画。但不要在手势本身期间设置动画。


在极少数情况下,单帧的渲染速度非常慢,但仍会出现延迟。显然,应该优化该draw(_:)过程,使其不慢(或拍摄快照并为快照视图而不是复杂视图设置动画)。但在手势过程中,您还可以使用“预测触摸”,即操作系统估计用户手势在未来的位置。例如,您可以实现touchesMoved(_:with:)然后调用predictedTouches(for:). 通过将视图移动到预测的触摸位置,它可以减少感知延迟。

于 2013-06-08T20:30:03.030 回答