2010-03-21 54 views
5

这是我一直在努力的一个棘手的iPhone问题。我在页面上有三个UIScrollView,一个只能水平滚动,一个只能垂直滚动,一个可以水平和垂直滚动。我想一起锁定视图,以便水平滚动视图的水平位置与主滚动视图的水平位置以及垂直滚动视图相匹配,以便拖动主滚动视图可控制水平滚动视图和垂直滚动视图。连接两个UIScrollView的在一起

问题是,我完全难倒了。我在苹果文档里面浏览过,但似乎没有办法正式做到这一点。我以为有一种想法是以某种方式将任何滚动视图的任何接触“克隆”到另外两个点上,但我不知道如何去做。如果有人对此有任何想法,我会非常感激。

编辑:我试着建议子类化UIScrollView和覆盖touchesMoved调用touchesMoved在其他滚动视图。不幸的是,touchesMoved并没有被要求进行滚动动作,因为UIScrollView以某种方式截取了这些动作并使用它们来控制它的滚动。我开始寻找更低级别的东西,并找到核心动画滚动层,但理想情况下,我不想从头开始重新创建UIScrollView。仍试图找出这一个。

回答

11

我认为最简单的方法是将一个委托添加到您的scrollviews其实现方法如下:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 

然后,您可以检查contentOffset以检查滚动视图实际滚动的次数,并相应地更新主滚动视图。

+0

真棒,这完美的作品。我现在觉得有点笨,但是谢谢你让我直立。 – johnw188 2010-03-24 20:36:15

+0

我惊呆了这个实际工作的无缝。我想到了它,但预计反弹等不会反映出来,它看起来很狡猾。这是完美的。谢谢马丁! – 2011-04-06 10:51:36

0

您需要为屏幕上的所有三种用途扩展UIScrollView,并覆盖touchesMoved:withEvent:方法来调用其他的方法(确保不会以循环代码结束再次调用自身!)。

因此,例如在双向滚动项目的代码可以在此基础上:通过使用一些额外的变量

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [horizontalScrollview touchesMoved:touches withEvent:event]; 
    [verticalScrollview touchesMoved:touches withEvent:event]; 
} 

(如ControllerLastTouched),您可以检查调用其他两个touchesMoved之前: withEvent:方法。

这将使你做的“克隆”你在谈论...

+0

嘿,所以我认为这是我正在寻找的东西,但事实证明东西比我想象的要复杂一点。当我设置这个安排时,对UIScrollView中包含的视图的任何接触都会被拾取,但是滚动动作本身不称为touchesMoved。我很确定这是由于UIScrollView的工作原理 - 它们在手指着陆时启动计时器,并且如果用户在一段时间内滚动,则开始滚动动作,否则将触摸传递给触摸处理方法的看法。 – johnw188 2010-03-24 18:15:15

相关问题