【问题标题】:Vertical UIScrollView over horizontal UIScrollView水平 UIScrollView 上的垂直 UIScrollView
【发布时间】:2015-11-10 20:00:47
【问题描述】:

iOS 8,斯威夫特。 我试图在水平滚动视图上拥有一个垂直滚动视图。它们都是 UIScrollView。垂直滚动视图允许从底部向上滑动视图。顶部有一个使用自动布局的间隔视图,宽度为 1 像素,但屏幕高度。

在底层视图本身是支持水平滚动的滚动视图之前,这可以正常工作。

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

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

我尝试了各种 hitTest、gestureRecognizer 委托方法、滚动视图子类化组合,但我想出了一个不错的干净解决方案。

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

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

【问题讨论】:

  • 好的,触摸事件是个问题,是的,我没有时间详细说明我将如何解决这个问题,但我有一些提示给你,首先,将 drectionalLockEnabled 设置为 TRUE两个滚动视图,其次,在你的scrollviewDidScrollMethod中设置,你有没有试过这个,假设你甚至有1次触摸甚至通过: if (scrollView ==_verticalScrollView) { [_verticalScrollView setContentOffset:CGPointMake(0, scrollView.contentOffset.y)] ; } else{ [_horizo​​ntalScrollView setContentOffset:CGPointMake(scrollView.contentOffset.x, 0)];
  • 还有一个想法,这就是我这样做的方法,是使用三个滚动视图,一个空且清晰的滚动视图位于其他两个滚动视图之上,这个滚动视图将允许向上移动向下和四周,然后你这样做: [_verticalScrollView setContentOffset:CGPointMake(0, _invisibleScrollView.contentOffset.y)]; [_horizo​​ntalScrollView setContentOffset:CGPointMake(_invisibleScrollView.contentOffset.x, 0)];当然,您不允许水平或垂直滚动​​视图上的触摸事件,只允许半不可见的顶部滚动视图,
  • 部分问题是我不知道如何让顶部滚动视图有条件地将平移手势传递给底层水平滚动视图。如果我覆盖 hitTest,我可以使所有事件都转到较低的 SV,而没有转到较高的 SV。我需要有条件地让水平平移转到下部滚动视图。
  • 我的意思是我认为你不需要,如果 TOP 不可见的 UIScrollView 拦截了所有事件,然后,在你的 ScrollViewDidScroll 中,你只需偏移水平滚动视图和顶部滚动视图的滑动方向的垂直滚动视图,这是一个讨厌的黑客,但它对我有用,启用顶部半隐形滚动方向锁定,然后将偏移量传递给其他滚动视图。在 ScrollViewDidScroll 中。我会 GIST 我的意思,一秒钟

标签: ios uiscrollview uigesturerecognizer horizontal-scrolling vertical-scrolling


【解决方案1】:

这里有一个简短的方法可以帮助你:

Obj-C

创建不可见的滚动视图,然后根据覆盖两个底层滚动视图的顶部不可见滚动视图上的触摸事件的偏移量,将不可见滚动视图或触摸事件的偏移量传递给下面的滚动视图:

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

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

斯威夫特:

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

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

【讨论】:

  • 使用不可见的分页滚动视图并使用它的 contentOffset 为后面的内容设置动画的想法非常棒!谢谢 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
  • 2013-12-25
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 2012-09-23
  • 1970-01-01
相关资源
最近更新 更多