如何在UIScrollView边缘滚动时拖动视图?

8
我正在尝试创建一种时间轴视图,类似于视频编辑器:将媒体元素放在一行中,这些元素是UIView。 我可以使用UIScrollView触摸事件(例如touchesBegantouchesMoved)在滚动视图的当前可见部分内成功拖动这些视图。我想在子视图被拖到滚动视图边缘之一时滚动滚动视图。目前我能想到的最好方法是创建一个定时器,当用户用手指靠近滚动视图边缘握住子视图时,它会滚动视图。
有很多关于相同主题的问题,但我无法找到一个涵盖滚动的问题。
有没有一个好的方法来做到这一点?我应该使用手势识别器吗?
提前感谢您的帮助。

你可以获取触摸的位置,如果它在“边缘区域”,就增加/减少scrollOffSet,这样就会出现滚动的效果。 - EagerMike
这就是我现在的做法,但我不喜欢结果,动画很卡顿,代码似乎不太可靠,因为它依赖于计时器。 - anticyclope
2个回答

9
实际上,您想要的是一个定时事件。当用户在滚动视图的边缘时,启动一个计时器,定期增加contentOffset。如果您不喜欢动画结果(我猜您使用了setContentOffset:animated:?),只需尝试另一种时间和距离的动画即可。我想您必须尝试一些不同的设置。我首先会尝试每次移动1像素。也许每0.3秒移动一次?
如果这行不通,您还可以尝试另一种“极端”方法。当用户到达边缘时开始单个动画,将contentOffset动画化直到contentSize的末端。但是时间很长,以便移动缓慢。如果用户停止拖动或移出边缘,请在当前位置停止动画。这甚至可以没有计时器而成为解决方案,因为动画本身就是计时器。

实际上,我现在必须关闭这个悬赏,因为我已经按照你在第一段描述的方式实现了它(这也是我的第一个想法)。主要问题是将此行为集成到我的滚动视图子类中,因为其子视图像表视图中的单元格一样被缓存。无论如何,现在我很高兴,即使使用计时器也可以实现。 我认为你可以在你的答案中添加一些要点,比如,在动画期间如何更新当前拖动视图的位置(以保持它在滚动视图滚动时在手指下方),这样答案就会完整,奖励将属于你 :) - anticyclope
实际上这里提出的问题并不是关于在滚动视图中实际拖动的问题 - 有不同的方法。我会参考这里的搜索,或者例如这个问题:https://dev59.com/Cmkw5IYBdhLWcg3wrsrn#9844006 - calimarkus
拖动在这里不适用,但是保持视图稳定,而底层的滚动视图正在进行带有动画效果的滚动,对我来说还不清楚,可能是因为我尚未尝试。 - anticyclope
如在另一个线程中所述,只要用户正在拖动视图,我将把拖动视图从滚动视图中移出到滚动视图的超级视图上。但是,如果您想留在滚动视图中,请记住contentOffset,以便您知道发生的变化。将x-contentOffset的更改再次应用于拖动视图的相反方向(* -1)。 - calimarkus
一个视图的位置应该在哪里更新?我明白了,但是由于我们没有计时器,并且滚动视图是通过动画滚动的(我认为你指的是animateWithDurationbeginAnimations),那么我应该把用于更新视图位置的代码放在哪里呢?滚动视图代理? - anticyclope
是的,检查一下ScrollView代理是否告诉了你这个变化(它来自于你的动画)...否则就在你的拖拽视图上设置另一个反向方向的动画。 - calimarkus

0
我严重怀疑手势识别器能成为解决方案的一部分,因为它们通常在离散手势上最有帮助。
根据上面的假设,即您正在寻找连续/渐进滚动,我不认为我可以改进您的整体方向。
相反,我建议您考虑采用分页滚动的方式来设计。当用户将对象拖到滚动视图的边缘时,使滚动视图朝该方向移动一页(通过设置contentOffset根据滚动视图的边界朝该方向移动)。当发生这种情况时,将对象稍微移出滚动视图边缘的“热区”,以强制用户明确表示他们想要移动到另一页,或者类似的操作 - 也就是说,由于设计方法依赖于这些“分页事件”,您需要实现某种手势系统让用户继续分页。
我想在同样的情况下,您可以使用计时器,这样如果用户保持位置和触摸时间超过一秒,您可以再次分页。

1
这不是一个胜利..而且你还有一个计时器..实际上,如果你考虑到视频编辑器,这是一个相当糟糕的解决方案。分页在这里并没有真正帮助。此外,如果您重新定位处于拖动状态的对象,这将是一种糟糕的用户体验... - calimarkus
有些手势识别器实际上还不错。如果您使用长按手势识别器,在长按“触发”后拖动,您将获得位置更新。我成功地使用这种方法来实现长按拖动(即进行长按,然后在长按被识别后开始拖动)。 - occulus
只是补充一下 - 我可能会在某个时候修改这种方法,因为它的一个弱点是,如果用户的手指/指针在长按期间稍微移动,它就不会被识别为长按... - occulus

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