检测用户何时中断 UIScrollView 动画

Posted

技术标签:

【中文标题】检测用户何时中断 UIScrollView 动画【英文标题】:Detect when a user interrupted UIScrollView animation 【发布时间】:2018-05-22 19:23:30 【问题描述】:

我有一个带有水平滚动 uiscrollview 的应用程序,它并排显示 3 个子视图。我正在使用目标 C。

当用户拖动和释放时,代码会检测哪个是最近的子视图,并自动滚动到 3 个子视图中最近的一个,使其完全居中。

这一切都很好,除了;

当滚动视图动画自动居中移动时,用户只需点击它(而不是拖动)即可中断。

单击此按钮可停止动画和滚动视图,使其不在 3 个子视图中的任何一个上居中。

我发现没有任何委托方法可以检测到动画何时中断然后继续居中。

我该怎么做?

【问题讨论】:

也许你可以检测到点击,或者当触摸结束,然后重新开始居中动画? 感谢皮恰诺。检测水龙头的最佳方法是什么?它会干扰子视图的用户交互吗? 【参考方案1】:

当您使用setContentOffset:animated:scrollToRectVisible:animated: 启动滚动动画时,其结束将由UIScrollViewDelegate 方法scrollViewDidEndScrollingAnimation: 标记。如果在调用其他委托方法之前,例如 scrollViewWillBeginDragging:scrollViewDidEndDecelerating: - 这意味着用户通过拖动(或点击)中断了您的动画。

您要做的是在用户停止拖动时重新启动动画 - 在 scrollViewDidEndDragging:willDecelerate:scrollViewDidEndDecelerating:

【讨论】:

感谢 mag_zbc!问题是,scrollViewWillbeginDragging: 不会仅仅轻轻一按就跳闸。它仅通过拖动动作触发。【参考方案2】:

再次感谢 mag_zbc!

这确实帮助我找到了解决方案。

我使动画过于复杂,在用户完成拖动后以及动画完成时检查当前位置。

为了解决它,我刚刚检查了scrollViewDidEndDecelerating:中的当前偏移量:

-如果最终偏移是三个正确位置之一(自动偏移完成不间断),则什么也不做。

-如果偏移不是正确的位置之一(动画被中断),则再次移动。

【讨论】:

以上是关于检测用户何时中断 UIScrollView 动画的主要内容,如果未能解决你的问题,请参考以下文章

自动滚动 UIScrollView,允许用户中断动画

检测用户何时将手指从 UIScrollView 上移开

如何检测 UIScrollView 何时变为可滚动?

如何检测UIScrollView何时完成滚动在Swift中

检测 UIScrollview 底部到达

检测UIScrollview底部到达