【问题标题】:Connect two UIScrollView's together将两个 UIScrollView 连接在一起
【发布时间】:2010-03-21 23:09:29
【问题描述】:

这是我一直在解决的一个棘手的 iPhone 问题。我在一个页面上有三个 UIScrollView,一个只水平滚动,一个只垂直滚动,一个水平和垂直滚动。我想将视图锁定在一起,以便仅水平滚动视图的水平位置与主滚动视图的水平位置匹配,垂直滚动视图同样如此,以便拖动主滚动视图控制水平和垂直滚动视图。

问题是,我完全被难住了。我已经查看了苹果文档,但似乎没有任何方法可以正式做到这一点。我的一个想法是以某种方式将任何滚动视图上的任何触摸“克隆”到另外两个上的某个点,但我不知道如何做到这一点。如果有人对此有任何想法,我将非常感激。

编辑:我尝试了继承 UIScrollView 并覆盖 touchesMoved 以在其他滚动视图上调用 touchesMoved 的建议。不幸的是,由于 UIScrollView 以某种方式拦截这些动作并使用它们来控制其滚动,因此不会调用 touchesMoved 进行滚动动作。我开始寻找更底层的东西并找到核心动画滚动层,但理想情况下我不想从头开始重新创建 UIScrollView。仍在试图弄清楚这一点。

【问题讨论】:

    标签: iphone


    【解决方案1】:

    我认为最简单的方法是向您的滚动视图添加一个委托,实现以下方法:

    - (void)scrollViewDidScroll:(UIScrollView *)scrollView
    

    然后您可以检查 contentOffset 以检查滚动视图实际滚动了多少,并相应地更新主滚动视图。

    【讨论】:

    • 太棒了,这很完美。我现在感觉有点笨,但谢谢你让我直截了当。
    • 我惊讶于这实际上是如何无缝运行的。我想过,但预计反弹等不会被反映,而且看起来很恶心。这是完美的。谢谢马丁!
    【解决方案2】:

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

    因此,例如双向滚动项中的代码可以基于此:

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

    通过使用一些额外的变量(例如ControllerLastTouched),您可以在调用其他两个 touchesMoved:withEvent: 方法之前检查它。

    这应该使您能够进行您所说的“克隆”...

    【讨论】:

    • 嘿,所以我以为这就是我要找的东西,但事实证明东西比我想象的要复杂一些。当我设置这种安排时,对 UIScrollView 中包含的视图的任何触摸都会被拾取,但滚动动作本身不会调用 touchesMoved。我很确定这是由于 UIScrollView 的工作方式 - 它们在手指触摸时启动计时器,如果人在一定时间内滚动它会启动滚动动作,否则它将触摸传递给触摸处理方法视图。
    猜你喜欢
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 2018-08-22
    • 2017-04-30
    • 2013-12-04
    • 2012-09-28
    • 2012-01-31
    相关资源
    最近更新 更多