**防止在水平滚动视图中拖动两个 CollectionViews**

**Prevent dragging of Two CollectionViews inside a horizontal Scrollview**

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

我遇到的问题之一是,当我在两个滚动视图中滚动到顶部时,在集合视图滚动指示器消失(集合视图停止滚动)后,我无法滚动到顶部不再(获得弹性效果)在集合视图中,而是接收到超级视图(水平滚动视图)上的触摸,然后集合视图被 shifted/misplaced 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 解决方案并且并不完美,因为当我开始手势时仅水平移动手势被识别,因为 translation.y == 0 然后我也可以在 y 轴上移动。其他方法,如 func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool { 会连续检查而不是仅在开始时检查,但不知何故无法识别水平滚动。所以,我现在能想到的唯一解决方案是重写水平滚动视图的 UIPanGestureRecognizer 以仅允许水平平移,但看起来很老套。请帮忙。 Objective-C 解决方案与 Swift 解决方案一样受欢迎。

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