2012-03-18 153 views
6

我试图创建某种类似于视频编辑器的时间线视图:连续的媒体元素,它们是UIView的。我可以使用UIScrollView触摸事件(如touchesBegantouchesMoved)成功拖动滚动视图当前可见部分内的这些视图。一旦子视图被拖动到其中一个滚动视图边缘,我想滚动滚动视图。我现在能想到的最好的方法是创建一个计时器,当用户用手指在滚动视图边缘附近握住子视图时,该计时器将滚动视图。如何通过滚动边缘来拖动UIScrollView中的视图?

这里有很多关于同一主题的问题,但我无法找到一个涵盖滚动的问题。

有没有做到这一点的好办法?我应该使用手势识别器吗?

预先感谢您。

+0

你可以得到触摸的位置,如果它在“边缘区域”递增/递减scrollOffSet,应该使它看起来滚动 – 2012-03-18 19:20:14

+0

这就是我现在正在做的,但我不喜欢结果,动画是生涩的,代码似乎不可靠,因为它取决于计时器。 – anticyclope 2012-03-19 02:54:56

回答

8

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

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

+0

其实,我必须关闭现在这个赏金,因为我已经以你在第一段描述的方式实施它(这也是我的第一个想法)。主要问题是将此行为集成到我的滚动视图子类中,因为其子视图像表视图中的单元格一样被缓存。无论如何,即使有计时器,我也很高兴。 我认为你可以给你的答案添加一些点,比如,在动画过程中如何更新当前拖动视图的位置(在滚动视图滚动时保持在手指下),所以答案将会完整,奖励将是你的:) – anticyclope 2012-03-24 21:53:49

+0

实际上这里问的问题并不是关于scrollview中的实际拖动 - 有不同的方法。我会参考这里的搜索,或者那个问题:http://stackoverflow.com/questions/9715582/iphone-ios-how-to-implement-drag-and-drop-for-subviews-of-a-scrollview/9844006#9844006 – calimarkus 2012-03-24 22:03:32

+0

拖动是不成问题的在这里,但保持视图稳定,而底层滚动视图用动画滚动并不清楚,可能是因为我还没有尝试。 – anticyclope 2012-03-24 22:06:49

0

我认真地怀疑手势识别器会是这个方法的一个很好的解决方案的一部分,因为它们往往对谨慎的手势最有帮助。

根据上面所暗示的假设,我不认为我可以改进您的总体方向,即您正在寻找连续/逐步滚动。

我的建议是,你考虑设计这个使用分页滚动的方法。当用户将对象拖动到滚动视图的边缘时,使滚动视图沿该方向移动一个页面(通过将contentOffset设置为根据滚动视图的边界向该方向移动)。当发生这种情况时,将对象略微移出滚动视图边缘的“热区”,以便用户不得不明确表示他们想要移动另一个页面,或沿着这些行移动 - 也就是说,自从设计方法依赖于这个“分页事件”,你需要为用户实现某种手势系统来保持分页。

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

+1

这就是没有胜利..你还有一个计时器..实际上它是一个非常糟糕的解决方案,如果你想到一个视频编辑器。分页在这里不会有帮助。此外,如果您重新定位处于拖动状态的对象,它的用户体验不佳...... – calimarkus 2012-03-24 21:21:02

+0

某些手势识别器实际上可以。如果您使用长按手势识别器,如果在长按“踢入”后拖动,则会获得位置更新。我成功地使用它来实现拖拽作为长按的一部分(即长按一次,然后在长按确认后开始拖动)。 – occulus 2012-04-24 08:48:49

+0

刚刚添加 - 我可能会在某些时候修改这种方法,因为一个弱点是,如果用户的手指/指针在长按期间甚至略微移动,它不会被识别为长按... – occulus 2012-04-24 09:21:06

相关问题