水平 UIScrollView 上的垂直 UIScrollView

Vertical UIScrollView over horizontal UIScrollView

iOS8,Swift。 我试图在水平滚动视图上有一个垂直滚动视图。它们都是 UIScrollView。垂直滚动视图允许从底部向上滑动视图。顶部有一个 spacer 视图,使用自动布局,宽度为 1 像素,但屏幕高度为 1。

在底层视图本身是一个支持水平滚动的滚动视图之前,它工作正常。

我不知何故需要将 left/right 平移手势传递给作为 UIScrollView 的子视图。

目前,顶层垂直滚动视图正在捕获所有手势,不让底层水平滚动视图看到事件。

我已经尝试了 hitTest、gestureRecognizer 委托方法、scrollview 子类化的各种组合,但提出了一个非常干净的解决方案。

当点击垂直滚动视图顶部的空白 space 时,我可以使用 hitTest 将事件传递给底层水平滚动视图,但是垂直滚动视图永远不会处理平移或向上滑动显示向上滑动时应显示的内容。

理想情况下,我希望顶部垂直滚动视图仅处理平移 up/down,并在垂直滚动视图位于顶部时将 left/right 平移传递给子视图。

这里有一个可能对您有所帮助的简单方法:

Obj-C:

创建不可见的滚动视图,然后将不可见滚动视图的偏移量或触摸事件传递给下面的滚动视图,具体取决于覆盖底层两个不可见滚动视图的触摸事件的偏移量滚动视图:

-(void)scrollViewDidScroll:(UIScrollView *)scrollView {
    [_verticalScrollView setContentOffset:CGPointMake(0, _insivibleScrollView.contentOffset.y)];
    [_horizontalScrollView setContentOffset:CGPointMake(_insivibleScrollView.contentOffset.x, 0)];
}

您创建了一个不可见的滚动视图,所谓不可见,我的意思是您可能必须将 alpha 值保持在 0.01 左右。您不允许水平和垂直滚动视图的用户交互,而是使用上面的方法,以便当用户触摸不可见的滚动视图时,您将这些触摸转换为下面的滚动视图,这些滚动视图被锁定以仅响应偏移量不可见的滚动视图。正如您在评论中所述,此答案可能有更多内容可以满足您的个人需求,但这是基本的 "foundation",可以为您提供您可能想要的效果。

Swift:

与上述方法相同,但这是您需要的函数:

func scrollViewDidScroll(scrollView: UIScrollView!) {
    verticalScrollView.contentOffset = CGPointMake(0, invisibleScrollView.contentOffset.y)
    horizontalScrollView.contentOffset = CGPointMake(invisibleScrollView.contentOffset.x, 0)
}