**防止在水平滚动视图内拖动两个 CollectionView **

Posted

技术标签:

【中文标题】**防止在水平滚动视图内拖动两个 CollectionView **【英文标题】:**Prevent dragging of Two CollectionViews inside a horizontal Scrollview** 【发布时间】:2016-03-16 19:34:36 【问题描述】:

我在水平滚动视图中有两个集合视图。为了简化事情,我没有导航栏或工具栏/TabBar。因此,我可以在集合视图中完美滚动(垂直滚动),也可以在集合视图之间完美滚动(使用水平滚动视图)。但是,我能够以某种方式拖动集合视图。为了区分,我设置了不同的背景颜色。所以,我有一个水平滚动视图,其背景颜色为黄色和两个子视图:第一个集合视图的背景颜色为红色,第二个集合视图的背景颜色为蓝色。水平滚动视图的工作方式类似于 UIPageControl。

我遇到的问题之一是当我在两个滚动视图中滚动到顶部时,在集合视图滚动指示器消失后(集合视图停止滚动),我无法再滚动到顶部(在集合视图中获得有弹性的效果),而是在超级视图(水平滚动视图)上接收触摸,然后,集合视图被移动/错位 20 像素,我通过子类化水平滚动视图和更改解决了这个问题手势识别方法:

override func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool 
    print("RECEIVING GEST RECOGNIZER IN CUSTOM SCROLLVIEW")
    if gestureRecognizer.isKindOfClass(UIPanGestureRecognizer)
        print("GEST IS PANGESTURERECOGNIZER")
         let gesture = gestureRecognizer as! UIPanGestureRecognizer
         if gesture.translationInView(self).y != 0  
                print("DO NOT ALLOW VERTICAL SCROLLING")
                return false
         
    
    return true

这似乎是一个 hacky 解决方案,并不完美,因为当我开始手势时,手势仅在水平移动时被识别,因为 translate.y == 0 然后我也可以在 y 轴上移动。像func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool 这样的其他方法会连续检查而不是只在开始时不以某种方式识别水平滚动。因此,我现在能想到的唯一解决方案是覆盖水平滚动视图的 UIPanGestureRecognizer 以仅允许水平翻译,但看起来很hacky。请帮忙。 Objective-C 解决方案与 Swift 解决方案一样受欢迎。

【问题讨论】:

我不明白你为什么需要 UIPanGestureRecognizer。两个 collectionView 都可以垂直滚动,而 scrollView 可以水平滚动。我可能误解了这个问题。拖动结果的屏幕截图会有所帮助。 【参考方案1】:

所以,问题与 UIStatusBar 有点相关。我不明白为什么,但是当状态栏出现时,每次我向下滑动集合视图的滚动视图时,都可以将集合视图向下“拖动”20 像素,向上滚动到顶部。我通过调用UIApplication.sharedApplication().statusBarHidden = false关闭了状态栏,问题解决了!

【讨论】:

以上是关于**防止在水平滚动视图内拖动两个 CollectionView **的主要内容,如果未能解决你的问题,请参考以下文章

将两个 UIScrollView 连接在一起

jquery UI可拖动:在容器内水平拖动溢出:滚动?

拖动子视图时防止 UIScrollView 滚动

IOS中水平滚动视图问题内的滑块

水平 UIScrollView 内部有垂直 UIScrollViews - 滚动外部水平视图时如何防止滚动内部滚动视图?

如何防止在水平滚动方向上从左到右滚动集合视图?