将两个 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 连接在一起的主要内容,如果未能解决你的问题,请参考以下文章
如何将UIButton粘贴到UIScrollView的底部? (Chatto框架)
如何使用主 iPhone 视图之外的 UI 元素在 Interface Builder 中设置 UIScrollView?
将 UIViewController 与 UIView 一起使用 - (想改用 UIScrollView) - 如何进行切换