Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在UIScrollView中拖动视图并在边缘附近滚动?_Ios_Uiscrollview_Drag And Drop - Fatal编程技术网

Ios 如何在UIScrollView中拖动视图并在边缘附近滚动?

Ios 如何在UIScrollView中拖动视图并在边缘附近滚动?,ios,uiscrollview,drag-and-drop,Ios,Uiscrollview,Drag And Drop,我试图创建某种时间线视图,就像在视频编辑器中一样:一行中的媒体元素,它们是UIView。我可以使用UIScrollView触摸事件(如touchsbegind和touchsmoved)将这些视图成功拖动到滚动视图的当前可见部分。我想在将子视图拖动到其中一个滚动视图边缘后滚动滚动视图。现在我能想到的最好的方法是创建一个计时器,当用户用手指在滚动视图边缘附近握住子视图时,它将滚动视图 这里有很多关于同一主题的问题,但我找不到一个涉及滚动的问题 有什么好办法吗?我应该使用手势识别器吗 提前谢谢。我严重

我试图创建某种时间线视图,就像在视频编辑器中一样:一行中的媒体元素,它们是
UIView
。我可以使用
UIScrollView
触摸事件(如
touchsbegind
touchsmoved
)将这些视图成功拖动到滚动视图的当前可见部分。我想在将子视图拖动到其中一个滚动视图边缘后滚动滚动视图。现在我能想到的最好的方法是创建一个计时器,当用户用手指在滚动视图边缘附近握住子视图时,它将滚动视图

这里有很多关于同一主题的问题,但我找不到一个涉及滚动的问题

有什么好办法吗?我应该使用手势识别器吗


提前谢谢。

我严重怀疑手势识别器是否是解决这一问题的好方法,因为它们往往对谨慎的手势最有帮助

基于上述假设,我认为我无法改进您的总体方向,即您正在寻找连续/渐进滚动

我建议你考虑设计一个页面滚动方法。当用户将对象拖动到scrollview的边缘时,使scrollview沿该方向移动一页(通过根据scrollview的边界将contentOffset设置为沿该方向移动)。当这种情况发生时,将对象稍微移出scrollview边缘的“热区”,这样用户就被迫明确表示他们想要移动另一个页面,或者沿着这些线移动一些东西——也就是说,因为设计方法依赖于这个“分页事件”您需要为用户实现某种手势系统来保持分页


我想你可以在同样的情况下使用计时器,这样如果用户保持位置并再触摸一秒钟,你就可以再次翻页。

实际上,你想要的是一个定时事件。一旦用户处于滚动视图的边缘,您就启动一个计时器,它会定期增加
contentOffset
。如果您不喜欢动画效果(我猜您使用的是
setContentOffset:animated:
?),请尝试另一个动画计时和距离。。我想你必须尝试一些不同的设置。我首先要尝试的是每次1px。也许每0.3秒


如果这不起作用,你也可以尝试另一个“极端”。当用户到达边缘时,启动单个动画,该动画将设置contentOffset的动画,直到contentSize结束。但是在很长的时间跨度内,运动是缓慢的。如果用户停止拖动或移出边缘,请在当前位置停止动画。这甚至是一个没有计时器的解决方案,因为动画本身就是你的计时器。

你可以得到触摸的位置,如果它在“边缘区域”的递增/递减滚动偏移,应该使它看起来滚动这就是我现在所做的,但我不喜欢结果,动画是不稳定的,代码似乎不可靠,因为这取决于计时器。这不是胜利。。你还有一个计时器。。实际上,如果你想到视频编辑器,这是一个非常糟糕的解决方案。在这里,分页并没有真正的帮助。此外,如果你重新定位一个处于拖动状态的对象,这也是一种糟糕的用户体验……一些手势识别器实际上是正常的。如果您使用长按手势识别器,如果在长按“踢入”后拖动,您将获得位置更新。我正在使用此方法成功地将拖动作为长按的一部分来实现(即,进行长按,然后在识别出长按后开始拖动)。只是补充一点-我可能会在某个时候修改此方法,因为缺点是,如果用户的手指/指针在长按过程中轻微移动,这不是一个长时间的新闻…事实上,我现在必须结束这个悬赏,因为我已经按照你在第一段中描述的方式实施了它(这也是我的第一个想法)。主要的问题是将此行为集成到我的滚动视图子类中,因为它的子视图像表视图中的单元格一样被缓存。不管怎样,即使有计时器,我现在也很开心。我想你可以在答案中添加一些要点,比如,如何在动画中更新当前拖动视图的位置(滚动视图滚动时将其置于手指下方),所以答案将是完整的,奖励将是你的:)事实上,这里所问的问题不是关于在scrollview中的实际拖动-有不同的方法。我想在这里指的是搜索,或者例如,这个问题:在这里拖动是不可能的,但是保持视图稳定,而底层的scrollview是用动画滚动的,我不清楚,可能是因为我还没有尝试。正如在另一个线程中所述,只要用户正在拖动,我就会将拖动视图从scrollview移到scrollview的superview上。但是,如果您想保持在scrollview中,只需记住contentOffset,就可以知道发生的更改。在另一个方向(
*-1
)将x-contentOffset的更改再次应用于拖动视图。应在何处更新视图位置?我明白了,但既然我们没有计时器,而且scrollview是用动画滚动的(我想你的意思是
animateWithDuration
beginAnimations
),我应该把视图位置更新的代码放在哪里?滚动视图代理?