将两个 UIScrollView 连接在一起

Posted

技术标签:

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

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

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

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

【问题讨论】:

【参考方案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 的工作方式 - 它们在手指触摸时启动计时器,如果人在一定时间内滚动它会启动滚动动作,否则它将触摸传递给触摸处理方法视图。

以上是关于将两个 UIScrollView 连接在一起的主要内容,如果未能解决你的问题,请参考以下文章

添加多个 UI 元素并一起约束

如何将UIButton粘贴到UIScrollView的底部? (Chatto框架)

如何将 UI 与微服务捆绑在一起

如何使用主 iPhone 视图之外的 UI 元素在 Interface Builder 中设置 UIScrollView?

将 UIViewController 与 UIView 一起使用 - (想改用 UIScrollView) - 如何进行切换

如何将两个 DataTable 与内部连接连接在一起